mysql - Hibernate Inheritance - Structure referring to Superclass -
i want create structure manage products in mysql using hibernate 4.1. in general there 2 kind of products: simpleproduct (contains description , price) , complexproduct (contains list containing products again).
so created abstact class product , derived classes simpleproduct , complexproduct. thought table_per_class inheritancetype convenient.
product.java
@entity @inheritance(strategy=inheritancetype.table_per_class) public abstract class product { private long id; private string description; private bigdecimal price; private product parent; protected product() { } protected product(string description, bigdecimal price) { this.description = description; this.price = price; } @id @generatedvalue(strategy = generationtype.table) @column(name="id") public long getid() { return id; } public void setid(long id) { this.id = id; } @column(name="description") public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } @column(name="price", precision=2, columndefinition="decimal(10,2)") public bigdecimal getprice() { return price; } public void setprice(bigdecimal price) { this.price = price; } @override public string tostring() { return getdescription()+", "+getprice()+"€"; } }
simpleproduct.java
@entity public class simpleproduct extends product { public simpleproduct() { super(); } public simpleproduct(string description, bigdecimal price) { super(description,price); } }
complexproduct.java
@entity public class complexproduct extends product { private list<product> containedproducts; public complexproduct() { } public complexproduct(string description, bigdecimal price, list<product> containedproducts) { super(description,price); if (containedproducts == null) { this.containedproducts = new arraylist<product>(); } else { this.containedproducts = containedproducts; } } public complexproduct(string description, bigdecimal price) { super(description,price); this.containedproducts = new arraylist<product>(); } @onetomany(targetentity=product.class, cascade=cascadetype.all, fetch=fetchtype.lazy) public list<product> getcontainedproducts() { return containedproducts; } public void setcontainedproducts(list<product> containedproducts) { this.containedproducts = containedproducts; } public void addtoproductlist(product p) { this.containedproducts.add(p); } }
then tried execute teststructure:
simpleproduct sp1 = new simpleproduct("simpleproduct1",new bigdecimal("2.99")); simpleproduct sp2 = new simpleproduct("simpleproduct2",new bigdecimal("4.99")); simpleproduct sp3 = new simpleproduct("simpleproduct3",new bigdecimal("3.99")); complexproduct cp1 = new complexproduct("complexproduct1",new bigdecimal("8.99")); cp1.addtoproductlist(sp2); cp1.addtoproductlist(sp3); hibernateutil.persist(sp1); hibernateutil.persist(sp2); hibernateutil.persist(sp3); hibernateutil.persist(cp1); hibernateutil.shutdown();
and here persist method:
public static void persist(object o) { session session = getsessionfactory().opensession(); transaction tx = session.begintransaction(); session.persist(o); tx.commit(); }
i know, persist-method teststructure no clean, test.
the problem exception when programm executing hibernateutil.persist(cp1):
exception in thread "main" org.hibernate.persistentobjectexception: detached entity passed persist: product
so, wrong it? , how can solve problem?
thank you
i have found solution: if use session.save(o) instead of session.persist(o) works!
Comments
Post a Comment