涔嬪墠涓鐩村湪鐢‥JB3錛屼絾鐜板湪鎯沖湪J2SE閲岄潰浣跨敤JPA錛屽洜涓轟笉澶у枩嬈ibernate鐨刋ML鏂囦歡閰嶇疆銆?/p>
鑰屼嬌鐢―B4O鐨勬椂鍊欙紝鍑虹幇浜嗕竴浜涜帿鍚嶅叾濡欑殑闂錛屼竴鐩存病瑙e喅錛屽氨鏆傛椂鎼佷笅浜嗐?/p>
浣跨敤myeclipse 6寮鍙慾pa濡備笅錛?/p>
1.鍒涘緩web project
2.娣誨姞jpa capabilities錛岄夋嫨toplink錛屾妸鑷姩鍒涘緩鏁版嵁搴撶殑鍜屾洿鏂皃ersistence.xml鐨勫嬀涓?/p>
3.鍒囨崲鎴恉atabase explorer瑙嗗浘錛岄夋嫨琛紝jpa閫嗗悜宸ョ▼銆?/p>
4.嫻嬭瘯
鐢熸垚鐨刾ersistence.xml濡備笅錛?/p>
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="JPAWebPU" transaction-type="RESOURCE_LOCAL"> <provider> oracle.toplink.essentials.PersistenceProvider </provider> <class>com.persia.entity.Consumer</class> <properties> <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/ejb3" /> <property name="toplink.jdbc.user" value="root" /> <property name="toplink.jdbc.password" value="root" /> <property name="toplink.ddl-generation" value="create-tables" /> </properties> </persistence-unit> </persistence>
鐢熸垚鐨勫嚑涓被濡備笅錛?/p>
瀹炰綋綾伙細
package com.persia.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; /** * Consumer entity. * * @author MyEclipse Persistence Tools */ @Entity @Table(name = "consumer", catalog = "ejb3", uniqueConstraints = {}) public class Consumer implements java.io.Serializable { // Fields private Integer id; private String name; private String password; // Constructors /** default constructor */ public Consumer() { } /** full constructor */ public Consumer(Integer id, String name, String password) { this.id = id; this.name = name; this.password = password; } // Property accessors @Id @Column(name = "id", unique = true, nullable = false, insertable = true, updatable = true) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Column(name = "name", unique = false, nullable = false, insertable = true, updatable = true, length = 45) public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Column(name = "password", unique = false, nullable = false, insertable = true, updatable = true, length = 45) public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } }
DAO鎺ュ彛
package com.persia.entity; import java.util.List; /** * Interface for ConsumerDAO. * * @author MyEclipse Persistence Tools */ public interface IConsumerDAO { /** * Perform an initial save of a previously unsaved Consumer entity. All * subsequent persist actions of this entity should use the #update() * method. This operation must be performed within the a database * transaction context for the entity's data to be permanently saved to the * persistence store, i.e., database. This method uses the * {@link javax.persistence.EntityManager#persist(Object) EntityManager#persist} * operation. * * <pre> * EntityManagerHelper.beginTransaction(); * IConsumerDAO.save(entity); * EntityManagerHelper.commit(); * </pre> * * @param entity * Consumer entity to persist * @throws RuntimeException * when the operation fails */ public void save(Consumer entity); /** * Delete a persistent Consumer entity. This operation must be performed * within the a database transaction context for the entity's data to be * permanently deleted from the persistence store, i.e., database. This * method uses the * {@link javax.persistence.EntityManager#remove(Object) EntityManager#delete} * operation. * * <pre> * EntityManagerHelper.beginTransaction(); * IConsumerDAO.delete(entity); * EntityManagerHelper.commit(); * entity = null; * </pre> * * @param entity * Consumer entity to delete * @throws RuntimeException * when the operation fails */ public void delete(Consumer entity); /** * Persist a previously saved Consumer entity and return it or a copy of it * to the sender. A copy of the Consumer entity parameter is returned when * the JPA persistence mechanism has not previously been tracking the * updated entity. This operation must be performed within the a database * transaction context for the entity's data to be permanently saved to the * persistence store, i.e., database. This method uses the * {@link javax.persistence.EntityManager#merge(Object) EntityManager#merge} * operation. * * <pre> * EntityManagerHelper.beginTransaction(); * entity = IConsumerDAO.update(entity); * EntityManagerHelper.commit(); * </pre> * * @param entity * Consumer entity to update * @returns Consumer the persisted Consumer entity instance, may not be the * same * @throws RuntimeException * if the operation fails */ public Consumer update(Consumer entity); public Consumer findById(Integer id); /** * Find all Consumer entities with a specific property value. * * @param propertyName * the name of the Consumer property to query * @param value * the property value to match * @return List<Consumer> found by query */ public List<Consumer> findByProperty(String propertyName, Object value); public List<Consumer> findByName(Object name); public List<Consumer> findByPassword(Object password); /** * Find all Consumer entities. * * @return List<Consumer> all Consumer entities */ public List<Consumer> findAll(); }
DAO綾?/p>
package com.persia.entity; import java.util.List; import java.util.logging.Level; import javax.persistence.EntityManager; import javax.persistence.Query; /** * A data access object (DAO) providing persistence and search support for * Consumer entities. Transaction control of the save(), update() and delete() * operations must be handled externally by senders of these methods or must be * manually added to each of these methods for data to be persisted to the JPA * datastore. * * @see com.persia.entity.Consumer * @author MyEclipse Persistence Tools */ public class ConsumerDAO implements IConsumerDAO { // property constants public static final String NAME = "name"; public static final String PASSWORD = "password"; private EntityManager getEntityManager() { return EntityManagerHelper.getEntityManager(); } /** * Perform an initial save of a previously unsaved Consumer entity. All * subsequent persist actions of this entity should use the #update() * method. This operation must be performed within the a database * transaction context for the entity's data to be permanently saved to the * persistence store, i.e., database. This method uses the * {@link javax.persistence.EntityManager#persist(Object) EntityManager#persist} * operation. * * <pre> * EntityManagerHelper.beginTransaction(); * ConsumerDAO.save(entity); * EntityManagerHelper.commit(); * </pre> * * @param entity * Consumer entity to persist * @throws RuntimeException * when the operation fails */ public void save(Consumer entity) { EntityManagerHelper.log("saving Consumer instance", Level.INFO, null); try { getEntityManager().persist(entity); EntityManagerHelper.log("save successful", Level.INFO, null); } catch (RuntimeException re) { EntityManagerHelper.log("save failed", Level.SEVERE, re); throw re; } } /** * Delete a persistent Consumer entity. This operation must be performed * within the a database transaction context for the entity's data to be * permanently deleted from the persistence store, i.e., database. This * method uses the * {@link javax.persistence.EntityManager#remove(Object) EntityManager#delete} * operation. * * <pre> * EntityManagerHelper.beginTransaction(); * ConsumerDAO.delete(entity); * EntityManagerHelper.commit(); * entity = null; * </pre> * * @param entity * Consumer entity to delete * @throws RuntimeException * when the operation fails */ public void delete(Consumer entity) { EntityManagerHelper.log("deleting Consumer instance", Level.INFO, null); try { entity = getEntityManager().getReference(Consumer.class, entity.getId()); getEntityManager().remove(entity); EntityManagerHelper.log("delete successful", Level.INFO, null); } catch (RuntimeException re) { EntityManagerHelper.log("delete failed", Level.SEVERE, re); throw re; } } /** * Persist a previously saved Consumer entity and return it or a copy of it * to the sender. A copy of the Consumer entity parameter is returned when * the JPA persistence mechanism has not previously been tracking the * updated entity. This operation must be performed within the a database * transaction context for the entity's data to be permanently saved to the * persistence store, i.e., database. This method uses the * {@link javax.persistence.EntityManager#merge(Object) EntityManager#merge} * operation. * * <pre> * EntityManagerHelper.beginTransaction(); * entity = ConsumerDAO.update(entity); * EntityManagerHelper.commit(); * </pre> * * @param entity * Consumer entity to update * @returns Consumer the persisted Consumer entity instance, may not be the * same * @throws RuntimeException * if the operation fails */ public Consumer update(Consumer entity) { EntityManagerHelper.log("updating Consumer instance", Level.INFO, null); try { Consumer result = getEntityManager().merge(entity); EntityManagerHelper.log("update successful", Level.INFO, null); return result; } catch (RuntimeException re) { EntityManagerHelper.log("update failed", Level.SEVERE, re); throw re; } } public Consumer findById(Integer id) { EntityManagerHelper.log("finding Consumer instance with id: " + id, Level.INFO, null); try { Consumer instance = getEntityManager().find(Consumer.class, id); return instance; } catch (RuntimeException re) { EntityManagerHelper.log("find failed", Level.SEVERE, re); throw re; } } /** * Find all Consumer entities with a specific property value. * * @param propertyName * the name of the Consumer property to query * @param value * the property value to match * @return List<Consumer> found by query */ @SuppressWarnings("unchecked") public List<Consumer> findByProperty(String propertyName, final Object value) { EntityManagerHelper.log("finding Consumer instance with property: " + propertyName + ", value: " + value, Level.INFO, null); try { final String queryString = "select model from Consumer model where model." + propertyName + "= :propertyValue"; Query query = getEntityManager().createQuery(queryString); query.setParameter("propertyValue", value); return query.getResultList(); } catch (RuntimeException re) { EntityManagerHelper.log("find by property name failed", Level.SEVERE, re); throw re; } } public List<Consumer> findByName(Object name) { return findByProperty(NAME, name); } public List<Consumer> findByPassword(Object password) { return findByProperty(PASSWORD, password); } /** * Find all Consumer entities. * * @return List<Consumer> all Consumer entities */ @SuppressWarnings("unchecked") public List<Consumer> findAll() { EntityManagerHelper.log("finding all Consumer instances", Level.INFO, null); try { final String queryString = "select model from Consumer model"; Query query = getEntityManager().createQuery(queryString); return query.getResultList(); } catch (RuntimeException re) { EntityManagerHelper.log("find all failed", Level.SEVERE, re); throw re; } } }
榪樻湁涓涓潪甯告湁鐢ㄧ殑helper
package com.persia.entity; import java.util.logging.Level; import java.util.logging.Logger; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; /** * @author MyEclipse Persistence Tools */ public class EntityManagerHelper { private static final EntityManagerFactory emf; private static final ThreadLocal<EntityManager> threadLocal; private static final Logger logger; static { emf = Persistence.createEntityManagerFactory("JPAWebPU"); threadLocal = new ThreadLocal<EntityManager>(); logger = Logger.getLogger("JPAWebPU"); logger.setLevel(Level.ALL); } public static EntityManager getEntityManager() { EntityManager manager = threadLocal.get(); if (manager == null || !manager.isOpen()) { manager = emf.createEntityManager(); threadLocal.set(manager); } return manager; } public static void closeEntityManager() { EntityManager em = threadLocal.get(); threadLocal.set(null); if (em != null) em.close(); } public static void beginTransaction() { getEntityManager().getTransaction().begin(); } public static void commit() { getEntityManager().getTransaction().commit(); } public static void rollback() { getEntityManager().getTransaction().rollback(); } public static Query createQuery(String query) { return getEntityManager().createQuery(query); } public static void log(String info, Level level, Throwable ex) { logger.log(level, info, ex); } }
鐒跺悗浣跨敤helper鍜宒ao榪涜嫻嬭瘯
package com.jpa.test; import java.util.List; import com.persia.entity.Consumer; import com.persia.entity.ConsumerDAO; import com.persia.entity.EntityManagerHelper; public class JPATest { /** * @param args */ public static void main(String[] args) { // 1.鍒涘緩 DAO ConsumerDAO dao = new ConsumerDAO(); // 2.鍒涘緩瀹炰綋綾?/span> Consumer c = new Consumer(); c.setName("jpa01"); c.setPassword("jianchi"); // 寮濮嬩簨鍔? EntityManagerHelper.beginTransaction(); // 3. 淇濆瓨 dao.save(c); // 鎻愪氦浜嬪姟鐪熸淇濆瓨瀹炰綋鍒版暟鎹簱 EntityManagerHelper.commit(); // 4. 鍒楀嚭鏁版嵁搴撲腑鎵鏈夊璞?/span> List<Consumer> result = dao.findAll(); for(Consumer o : result) { System.out.println(o.getId()); System.out.println(o.getName()); } } }
嫻嬭瘯瀹炰緥濡備笅錛?/p>
package test; import java.util.List; import dao.*; public class JPATest { public static void main(String[] args) { // 1.鍒涘緩 DAO StudentDAO dao = new StudentDAO(); // 2.鍒涘緩瀹炰綋綾?/span> Student user = new Student(); user.setUsername("hellojpa test"); user.setPassword("jpa password"); user.setAge(20); // 寮濮嬩簨鍔? EntityManagerHelper.beginTransaction(); // 3. 淇濆瓨 dao.save(user); // 鎻愪氦浜嬪姟鐪熸淇濆瓨瀹炰綋鍒版暟鎹簱 EntityManagerHelper.commit(); // 4. 鍒楀嚭鏁版嵁搴撲腑鎵鏈夊璞?/span> List<Student> result = dao.findAll(); for(Student o : result) { System.out.println(o.getId()); System.out.println(o.getUsername()); } // 5. 鏇存敼鐢ㄦ埛鍚?/span> user.setUsername("嫻嬭瘯JPA"); // 寮濮嬩簨鍔? EntityManagerHelper.beginTransaction(); // 淇濆瓨錛圝PA浼氳嚜鍔ㄦ洿鏂板彉鍔ㄨ繃鐨勫瓧孌碉級 dao.update(user); // 鎻愪氦浜嬪姟鐪熸淇濆瓨瀹炰綋鍒版暟鎹簱 EntityManagerHelper.commit(); // 6. 鏌ユ壘鎵鏈夊勾榫勪負20鐨勭敤鎴鳳紝浠庣1涓紑濮嬭幏鍙栵紙絎?涓槸絎竴鏉¤褰曪級 result = dao.findByAge(20, 1); for(Student o : result) { System.out.println(o.getId()); System.out.println(o.getUsername()); } // 7. 鏍規嵁 ID 鏌ユ壘 user = dao.findById(2); System.out.println(user.getUsername()); // 8. 鍒犻櫎 // 寮濮嬩簨鍔? EntityManagerHelper.beginTransaction(); // 淇濆瓨錛圝PA浼氳嚜鍔ㄦ洿鏂板彉鍔ㄨ繃鐨勫瓧孌碉級 dao.delete(user); // 鎻愪氦浜嬪姟鐪熸淇濆瓨瀹炰綋鍒版暟鎹簱 EntityManagerHelper.commit(); } }
鑻ラ儴緗插埌tomcat錛屾病鏈変粈涔堥棶棰橈紝涔熶笉瑕侀澶栨坊鍔犱粈涔堛?/p>
Table鐢ㄦ潵瀹氫箟entity涓昏〃鐨刵ame錛宑atalog錛宻chema絳夊睘鎬с?
鍏冩暟鎹睘鎬ц鏄庯細
@Entity
@Table(name="CUST")
public class Customer { ... }
銆銆
涓涓猠ntity class鍙互鏄犲皠鍒板琛紝SecondaryTable鐢ㄦ潵瀹氫箟鍗曚釜浠庤〃鐨勫悕瀛楋紝涓婚敭鍚嶅瓧絳夊睘鎬с?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄嶤ustomer綾繪槧灝勫埌涓や釜琛紝涓昏〃鍚嶆槸CUSTOMER錛屼粠琛ㄥ悕鏄疌UST_DETAIL錛屼粠琛ㄧ殑涓婚敭鍒楀拰涓昏〃鐨勪富閿垪綾誨瀷鐩稿悓錛屽垪鍚嶄負CUST_ID銆?
@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))
public class Customer { ... }
褰撲竴涓猠ntity class鏄犲皠鍒頒竴涓富琛ㄥ拰澶氫釜浠庤〃鏃訛紝鐢⊿econdaryTables鏉ュ畾涔夊悇涓粠琛ㄧ殑灞炴с?
鍏冩暟鎹睘鎬ц鏄庯細
@Table(name = "CUSTOMER")
@SecondaryTables( value = {
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })
public class Customer {}
UniqueConstraint瀹氫箟鍦═able鎴朣econdaryTable鍏冩暟鎹噷錛岀敤鏉ユ寚瀹氬緩琛ㄦ椂闇瑕佸緩鍞竴綰︽潫鐨勫垪銆?
鍏冩暟鎹睘鎬ц鏄庯細
@Entity
@Table(name="EMPLOYEE",
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}
)
public class Employee { ... }
Column鍏冩暟鎹畾涔変簡鏄犲皠鍒版暟鎹簱鐨勫垪鐨勬墍鏈夊睘鎬э細鍒楀悕錛屾槸鍚﹀敮涓錛屾槸鍚﹀厑璁鎬負絀猴紝鏄惁鍏佽鏇存柊絳夈?
鍏冩暟鎹睘鎬ц鏄庯細
public class Person {
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)
private String name;
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")
private byte[] picture;
濡傛灉鍦╡ntity class鐨刦ield涓婂畾涔変簡鍏崇郴錛坥ne2one鎴杘ne2many絳夛級錛屾垜浠氳繃JoinColumn鏉ュ畾涔夊叧緋葷殑灞炴с侸oinColumn鐨勫ぇ閮ㄥ垎灞炴у拰Column綾諱技銆?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄嶤ustom鍜孫rder鏄竴瀵逛竴鍏崇郴銆傚湪Order瀵瑰簲鐨勬槧灝勮〃寤轟竴涓悕涓篊UST_ID鐨勫垪錛岃鍒椾綔涓哄閿寚鍚慍ustom瀵瑰簲琛ㄤ腑鍚嶄負ID鐨勫垪銆?
public class Custom {
@OneToOne
@JoinColumn(
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)
public order getOrder() {
return order;
}
濡傛灉鍦╡ntity class鐨刦ield涓婂畾涔変簡鍏崇郴錛坥ne2one鎴杘ne2many絳夛級錛屽茍涓斿叧緋誨瓨鍦ㄥ涓狫oinColumn錛岀敤JoinColumns瀹氫箟澶氫釜JoinColumn鐨勫睘鎬с?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄嶤ustom鍜孫rder鏄竴瀵逛竴鍏崇郴銆傚湪Order瀵瑰簲鐨勬槧灝勮〃寤轟袱鍒楋紝涓鍒楀悕涓篊UST_ID錛岃鍒椾綔涓哄閿寚鍚慍ustom瀵瑰簲琛ㄤ腑鍚嶄負ID鐨勫垪,鍙︿竴鍒楀悕涓篊UST_NAME錛岃鍒椾綔涓哄閿寚鍚慍ustom瀵瑰簲琛ㄤ腑鍚嶄負NAME鐨勫垪銆?
public class Custom {
@OneToOne
@JoinColumns({
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
@JoinColumn(name="CUST_NAME", referencedColumnName="NAME")
})
public order getOrder() {
return order;
}
澹版槑褰撳墠field涓烘槧灝勮〃涓殑涓婚敭鍒椼俰d鍊肩殑鑾峰彇鏂瑰紡鏈変簲縐嶏細TABLE, SEQUENCE, IDENTITY, AUTO, NONE銆侽racle鍜孌B2鏀寔SEQUENCE錛孲QL Server鍜孲ybase鏀寔IDENTITY,mysql鏀寔AUTO銆傛墍鏈夌殑鏁版嵁搴撻兘鍙互鎸囧畾涓篈UTO錛屾垜浠細鏍規嵁涓嶅悓鏁版嵁搴撳仛杞崲銆侼ONE (榛樿)闇瑕佺敤鎴瘋嚜宸辨寚瀹欼d鐨勫箋傚厓鏁版嵁灞炴ц鏄庯細
涓嬮潰鐨勪唬鐮佸0鏄嶵ask鐨勪富閿垪id鏄嚜鍔ㄥ闀跨殑銆?Oracle鍜孌B2浠庨粯璁ょ殑SEQUENCE鍙栧鹼紝SQL Server鍜孲ybase璇ュ垪寤烘垚IDENTITY錛宮ysql璇ュ垪寤烘垚auto increment銆?
@Entity
@Table(name = "OTASK")
public class Task {
@Id(generate = GeneratorType.AUTO)
public Integer getId() {
return id;
}
}
褰揺ntity class浣跨敤澶嶅悎涓婚敭鏃訛紝闇瑕佸畾涔変竴涓被浣滀負id class銆俰d class蹇呴』絎﹀悎浠ヤ笅瑕佹眰:綾誨繀欏誨0鏄庝負public錛屽茍鎻愪緵涓涓0鏄庝負public鐨勭┖鏋勯犲嚱鏁般傚繀欏誨疄鐜癝erializable鎺ワ紝瑕嗗啓 equals()鍜宧ashCode錛堬級鏂規硶銆俥ntity class鐨勬墍鏈塱d field鍦╥d class閮借瀹氫箟錛屼笖綾誨瀷涓鏍楓?
鍏冩暟鎹睘鎬ц鏄庯細
public class EmployeePK implements java.io.Serializable{
String empName;
Integer empAge;
public EmployeePK(){}
public boolean equals(Object obj){ ......}
public int hashCode(){......}
}
@IdClass(value=com.acme.EmployeePK.class)
@Entity(access=FIELD)
public class Employee {
@Id String empName;
@Id Integer empAge;
}
鍦ㄤ竴瀵瑰錛屽瀵瑰鍏崇郴涓紝鎴戜滑鍙互鐢∕ap鏉ヤ繚瀛橀泦鍚堝璞°傞粯璁ょ敤涓婚敭鍊煎仛key錛屽鏋滀嬌鐢ㄥ鍚堜富閿紝鍒欑敤id class鐨勫疄渚嬪仛key錛屽鏋滄寚瀹氫簡name灞炴э紝灝辯敤鎸囧畾鐨刦ield鐨勫煎仛key銆?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄嶱erson鍜孊ook涔嬮棿鏄竴瀵瑰鍏崇郴銆侾erson鐨刡ooks瀛楁鏄疢ap綾誨瀷錛岀敤Book鐨刬sbn瀛楁鐨勫間綔涓篗ap鐨刱ey銆?
@Table(name = "PERSON")
public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@MapKey(name = "isbn")
private Map books = new HashMap();
}
鍦ㄤ竴瀵瑰錛屽瀵瑰鍏崇郴涓紝鏈夋椂鎴戜滑甯屾湜浠庢暟鎹簱鍔犺澆鍑烘潵鐨勯泦鍚堝璞℃槸鎸変竴瀹氭柟寮忔帓搴忕殑錛岃繖鍙互閫氳繃OrderBy鏉ュ疄鐜幫紝榛樿鏄寜瀵硅薄鐨勪富閿崌搴忔帓鍒椼?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄嶱erson鍜孊ook涔嬮棿鏄竴瀵瑰鍏崇郴銆傞泦鍚坆ooks鎸夌収Book鐨刬sbn鍗囧簭錛宯ame闄嶅簭鎺掑垪銆?
@Table(name = "MAPKEY_PERSON")
public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@OrderBy(name = "isbn ASC, name DESC")
private List books = new ArrayList();
}
鍦ㄤ笁縐嶆儏鍐典笅浼氱敤鍒癙rimaryKeyJoinColumn銆?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄嶤ustomer鏄犲皠鍒頒袱涓〃錛屼富琛–USTOMER,浠庤〃CUST_DETAIL錛屼粠琛ㄩ渶瑕佸緩绔嬩富閿垪CUST_ID錛岃鍒楀拰涓昏〃鐨勪富閿垪id闄や簡鍒楀悕涓嶅悓錛屽叾浠栧畾涔変竴鏍楓?
@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"錛宺eferencedColumnName="id"))
public class Customer {
@Id(generate = GeneratorType.AUTO)
public Integer getId() {
return id;
}
}
涓嬮潰鐨勪唬鐮佽鏄嶦mployee鍜孍mployeeInfo鏄竴瀵逛竴鍏崇郴錛孍mployee鐨勪富閿垪id浣滀負澶栭敭鎸囧悜EmployeeInfo鐨勪富閿垪INFO_ID銆?
@Table(name = "Employee")
public class Employee {
@OneToOne
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")
EmployeeInfo info;
}
濡傛灉entity class浣跨敤浜嗗鍚堜富閿紝鎸囧畾鍗曚釜PrimaryKeyJoinColumn涓嶈兘婊¤凍瑕佹眰鏃訛紝鍙互鐢≒rimaryKeyJoinColumns鏉ュ畾涔夊涓狿rimaryKeyJoinColumn銆?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佽鏄庝簡Employee鍜孍mployeeInfo鏄竴瀵逛竴鍏崇郴銆備粬浠兘浣跨敤澶嶅悎涓婚敭錛屽緩琛ㄦ椂闇瑕佸湪Employee琛ㄥ緩绔嬩竴涓閿紝浠嶦mployee鐨勪富閿垪id,name鎸囧悜EmployeeInfo鐨勪富閿垪INFO_ID鍜孖NFO_NAME.
@Entity
@IdClass(EmpPK.class)
@Table(name = "EMPLOYEE")
public class Employee {
private int id;
private String name;
private String address;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})
EmployeeInfo info;
}
@Entity
@IdClass(EmpPK.class)
@Table(name = "EMPLOYEE_INFO")
public class EmployeeInfo {
@Id
@Column(name = "INFO_ID")
private int id;
@Id
@Column(name = "INFO_NAME")
private String name;
}
Transient鐢ㄦ潵娉ㄩ噴entity鐨勫睘鎬э紝鎸囧畾鐨勮繖浜涘睘鎬т笉浼氳鎸佷箙鍖栵紝涔熶笉浼氫負榪欎簺灞炴у緩琛ㄣ?
@Transient
private String name;
Version鎸囧畾瀹炰綋綾誨湪涔愯浜嬪姟涓殑version灞炴с傚湪瀹炰綋綾婚噸鏂扮敱EntityManager綆$悊騫朵笖鍔犲叆鍒頒箰瑙備簨鍔′腑鏃訛紝淇濊瘉瀹屾暣鎬с傛瘡涓涓被鍙兘鏈変竴涓睘鎬ц鎸囧畾涓簐ersion錛寁ersion灞炴у簲璇ユ槧灝勫埌瀹炰綋綾葷殑涓昏〃涓娿?
涓嬮潰鐨勪唬鐮佽鏄巚ersionNum灞炴т綔涓鴻繖涓被鐨剉ersion錛屾槧灝勫埌鏁版嵁搴撲腑涓昏〃鐨勫垪鍚嶆槸OPTLOCK銆?
@Version
@Column("OPTLOCK")
protected int getVersionNum() { return versionNum; }
Lob鎸囧畾涓涓睘鎬т綔涓烘暟鎹簱鏀寔鐨勫ぇ瀵硅薄綾誨瀷鍦ㄦ暟鎹簱涓瓨鍌ㄣ備嬌鐢↙obType榪欎釜鏋氫婦鏉ュ畾涔塋ob鏄簩榪涘埗綾誨瀷榪樻槸瀛楃綾誨瀷銆?
LobType鏋氫婦綾誨瀷璇存槑錛?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佸畾涔変簡涓涓狟LOB綾誨瀷鐨勫睘鎬у拰涓涓狢LOB綾誨瀷鐨勫睘鎬с?
@Lob
@Column(name="PHOTO" columnDefinition="BLOB NOT NULL")
protected JPEGImage picture;
@Lob(fetch=EAGER, type=CLOB)
@Column(name="REPORT")
protected String report;
JoinTable鍦╩any-to-many鍏崇郴鐨勬墍鏈夎呬竴杈瑰畾涔夈傚鏋滄病鏈夊畾涔塉oinTable錛屼嬌鐢↗oinTable鐨勯粯璁ゅ箋?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佸畾涔変簡涓涓繛鎺ヨ〃CUST鍜孭HONE鐨刯oin table銆俲oin table鐨勮〃鍚嶆槸CUST_PHONE錛屽寘鍚袱涓閿紝涓涓閿槸CUST_ID錛屾寚鍚戣〃CUST鐨勪富閿甀D錛屽彟涓涓閿槸PHONE_ID錛屾寚鍚戣〃PHONE鐨勪富閿甀D銆?
@JoinTable(
table=@Table(name=CUST_PHONE),
joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
)
TableGenerator瀹氫箟涓涓富閿肩敓鎴愬櫒錛屽湪Id榪欎釜鍏冩暟鎹殑generate錛漈ABLE鏃訛紝generator灞炴т腑鍙互浣跨敤鐢熸垚鍣ㄧ殑鍚嶅瓧銆傜敓鎴愬櫒鍙互鍦ㄧ被銆佹柟娉曟垨鑰呭睘鎬т笂瀹氫箟銆?
鐢熸垚鍣ㄦ槸涓哄涓疄浣撶被鎻愪緵榪炵畫鐨処D鍊肩殑琛紝姣忎竴琛屼負涓涓被鎻愪緵ID鍊鹼紝ID鍊奸氬父鏄暣鏁般?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佸畾涔変簡涓や釜鐢熸垚鍣╡mpGen鍜宎ddressGen錛岀敓鎴愬櫒鐨勮〃鏄疘D_GEN銆?
@Entity public class Employee {
...
@TableGenerator(name="empGen",
table=@Table(name="ID_GEN"),
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="EMP_ID",
allocationSize=1)
@Id(generate=TABLE, generator="empGen")
public int id;
...
}
@Entity public class Address {
...
@TableGenerator(name="addressGen",
table=@Table(name="ID_GEN"),
pkColumnValue="ADDR_ID")
@Id(generate=TABLE, generator="addressGen")
public int id;
...
}
SequenceGenerator瀹氫箟涓涓富閿肩敓鎴愬櫒錛屽湪Id榪欎釜鍏冩暟鎹殑generator灞炴т腑鍙互浣跨敤鐢熸垚鍣ㄧ殑鍚嶅瓧銆傜敓鎴愬櫒鍙互鍦ㄧ被銆佹柟娉曟垨鑰呭睘鎬т笂瀹氫箟銆傜敓鎴愬櫒鏄暟鎹簱鏀寔鐨剆equence瀵硅薄銆?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佸畾涔変簡涓涓嬌鐢ㄦ彁渚涘晢榛樿鍚嶇О鐨剆equence鐢熸垚鍣ㄣ?
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)
DiscriminatorColumn瀹氫箟鍦ㄤ嬌鐢⊿INGLE_TABLE鎴朖OINED緇ф壙絳栫暐鐨勮〃涓尯鍒笉緇ф壙灞傛鐨勫垪銆?
鍏冩暟鎹睘鎬ц鏄庯細
涓嬮潰鐨勪唬鐮佸畾涔変簡涓涓垪鍚嶄負DISC錛岄暱搴︿負20鐨凷tring綾誨瀷鐨勫尯鍒垪銆?
@Entity
@Table(name="CUST")
@Inheritance(strategy=SINGLE_TABLE,
discriminatorType=STRING,
discriminatorValue="CUSTOMER")
@DiscriminatorColumn(name="DISC", length=20)
public class Customer { ... }