/** @author Dimitri Dean DARSEYNE (D3), * published by Short-Circuit under Creative Commons (CC) Licensing: * Authorship/Paternity, NO Commercial Use, NO Derivative * please check for more informations: * http://creativecommons.org/licenses/by-nc-nd/2.0/ * * auteur Dimitri Dean DARSEYNE (D3), * publié par Short-Circuit sous license Creative Commons (CC): * Paternité, PAS d'Utilisation Commerciale, pas de Dérivés/Modifications * Pour plus d'informations, se rendre sur: * http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ * * @since Short-Circuit 1999 */ JPA Cheat Sheet ------------------------------------------------------------- Clé composée @Embeddable public class ServiceComposedPK implements Serializable { @Column(name="FIRST_ID") @Getter @Setter private int firstId; @Column(name="SECOND_ID") @Getter @Setter private int secondId; public ServiceComposedPK() {} public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof ServiceComposedPK)) return false; ServiceComposedPK cPK = (ServiceComposedPK) o; return (this.firstId == cPK.firstId) && (this.secondId == cPK.secondId); } //Two randomly chosen, non-zero, odd numbers; Prime numbers are preferred, especially for the multiplier. //Ideally these should be different for each class, however this is not vital. //new org.apache.commons.lang.builder.HashCodeBuilder(17, 31).append(firstId).append(secondId).toHashCode(); public int hashCode() { final int prime = 31; int hash = 17; hash = hash * prime + this.firstId; hash = hash * prime + this.secondId; return hash; } } --- Abstract shared/extended PK @MappedSuperclass @ToString() public class AbstractIdentity implements Serializable { @Id @Column(name="ID") @GeneratedValue(strategy=GenerationType.IDENTITY) @Getter @Setter private Integer id; public AbstractIdentity() {} } --- @Entity @Table(name="SERVICE") @NamedQueries({ @NamedQuery(name="Service.findAll", query="from Service o"), @NamedQuery(name="Service.findById", query="SELECT o FROM Service o WHERE o.id = :id")}) @ToString(callSuper=true) public class Service extends AbstractIdentity implements Serializable { //mutually exclusive with "extends AbstractIdentity" class declaration @EmbeddedId private ComposedPK id; @Column(name="VALUE") @Getter @Setter private String value; @Column(name="VERSION_NUMBER") @Getter @Setter private Integer versionNumber; @Column(name="END_DATE") @Temporal(TemporalType.TIMESTAMP) private Timestamp endDate; private transient String transientProperty; //Mandatory "insertable=false, updatable=false" because part of composed PK @ManyToOne @JoinColumn(name="SECOND_ID", insertable=false, updatable=false) @Getter @Setter private Second secondRef; @ManyToOne @JoinColumn(name="Ref_ID") @Getter @Setter private Reference ref; //relation toOne via table externe @ManyToOne(fetch=FetchType.LAZY) @JoinTable( name="PARENT_SERVICE", joinColumns=@JoinColumn(name="SERVICE_ID", referencedColumnName="ID")) @JoinColumn(name="PARENT_ID") @Getter @Setter private Service parent; //////////// //LIST REF// //////////// //@OneToMany(mappedBy="sourceService") -> ici sans @JoinColumn, si reference bidirectionnelle dans la classe fille, //reference declaree en @ManyToOne, @JoinColumn(name="SERVICE_ID"), private Service sourceService //(FYI: mappedBy & @JoinColumn/@JoinTable: mutually exclusive // @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="SERVICE_ID") @Getter @Setter private List refs; @ManyToMany(fetch=FetchType.LAZY) @JoinTable( name="SERVICE_CLIENT", joinColumns=@JoinColumn( name="SERVICE_ID", referencedColumnName="ID"), inverseJoinColumns=@JoinColumn( name="CLIENT_ID", referencedColumnName="ID")) @Getter @Setter private List clients = new ArrayList(); ///////////////////// //TERNAIRE (Simple)// ///////////////////// @ManyToMany(fetch=FetchType.LAZY) @MapKeyJoinColumn(name="ENTITY_ID", referencedColumnName="ID") @JoinTable( name="SERVICE_ENTITY_VALUE", joinColumns=@JoinColumn(name="SERVICE_ID", referencedColumnName="ID"), inverseJoinColumns=@JoinColumn(name="VALUE_ID", referencedColumnName="ID") ) @Getter @Setter private Map defaultDueDateRules = new TreeMap(); ////////////////////////////////////// //ENUMERATION COLLECTION(LIST + MAP)// ////////////////////////////////////// @ElementCollection(targetClass=ERight.class) @Enumerated(EnumType.ORDINAL) //ORDINAL | STRING @CollectionTable( name="SERVICE_RIGHT", joinColumns=@JoinColumn(name="SERVICE_ID")) @Column(name="RIGHT_CODE") @Getter @Setter private List rights = new ArrayList(); @ElementCollection(fetch=FetchType.LAZY) @MapKeyColumn(name="STATUS") @MapKeyEnumerated(EnumType.STRING) //ORDINAL | STRING @CollectionTable( name="SERVICE_ROLE", joinColumns=@JoinColumn(name="SERVICE_ID", referencedColumnName="ID")) @Column(name="ROLE_ID") @Getter @Setter private Map roles = new TreeMap(); }