with manytomany many ejemplos ejemplo consultas column jpa time types annotations duration

manytomany - Cómo asignar el tipo de duración con JPA



jpa many to many with extra column (3)

Puede duplicar los campos exactos de la clase Duration en su propia clase personalizada, pero eso podría ser excesivo ... Supongo que no necesita ese tipo de flexibilidad / granularidad de duración.

Así que elija los campos que desee, agréguelos a su clase, marque la clase con la anotación @Embeddable y agregue las anotaciones JPA adecuadas a los campos (que asumo serán simples).

En su entidad que almacenará una duración, agregue la anotación @Embedded al campo o captador, lo que normalmente usa. Desde aquí puede modificar aún más las definiciones de columnas con @AttributeOverride.

Tengo un campo de propiedad en una clase que es del tipo javax.xml.datatype.Duration . Básicamente representa un lapso de tiempo (por ejemplo, 4 horas y 34 minutos).

JPA me dice que es un tipo inválido, lo cual no me sorprende.

¿Cuál es una buena solución? Podría implementar mi propia clase de Duración, pero no sé cómo lograr que JPA la "acepte" como un tipo de datos.


¿Cuál es una buena solución? Podría implementar mi propia clase de Duración, pero no sé cómo lograr que JPA la "acepte" como un tipo de datos.

JPA no es compatible con los tipos personalizados, por lo que si desea ir de esta forma, deberá usar una extensión JPA de su proveedor. Por ejemplo, Hibernate permite definir tipos de valores personalizados que declaras con @Type . Obviamente, esto dañará la portabilidad entre los proveedores, lo que podría ser una preocupación. Si no, entonces sabes que es factible.

Con JPA estándar, el enfoque tradicional sería agregar otro par getter / setter que adapte la propiedad problemática y realice la conversión cuando se acceda. Usaría un Long para almacenar una duración:

public MyEntity implements Serializable { private Long id; private javax.xml.datatype.Duration duration; @Id @GeneratedValue public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } @Transient public Duration getDuration() { return this.duration; } public void setDuration(Duration duration) { this.duration = duration; } public Long getDurationAsJpaCompatibleType() { return MyXmlUtil.convertDurationToLong(this.duration); } public void setDurationAsJpaCompatibleType(Long duration) { setDuration(MyXmlUtil.convertLongToDuration(duration)); } }


Podrías probar joda-time hibernate . Consulte los tipos disponibles que pueden conservarse. Luego puede usar la Duración joda de la siguiente manera:

@Type(type="org.joda.time.contrib.hibernate.PersistentDuration") private Duration startDateTime;