如何在hibernate一对一映射中更新和删除记录?
有人能给我举一个例子来更新和删除一对一hibernate映射中的记录吗 我有两张表customer和customeraddress。我能够使用以下代码在两个表中添加记录如何在hibernate一对一映射中更新和删除记录?,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,有人能给我举一个例子来更新和删除一对一hibernate映射中的记录吗 我有两张表customer和customeraddress。我能够使用以下代码在两个表中添加记录 customerForm.setcustomerAddress(customerAddress); customerAddress.setCustomer(customerForm); getEntityManager().persist(customerForm); 现在我想删除并更新记录 @Entity @Table(na
customerForm.setcustomerAddress(customerAddress);
customerAddress.setCustomer(customerForm);
getEntityManager().persist(customerForm);
现在我想删除并更新记录
@Entity
@Table(name="customers")
public class Customer {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name="id")
public int getId() {
return id;
}
@Column(name="customerName")
public String getcustomerName() {
return customerName;
}
@Column(name="password")
public String getpassword() {
return password;
}
@OneToOne(mappedBy = "customer", cascade = CascadeType.ALL)
public CustomerAddess getcustomerAddress() {
return customerAddress;
}
//rest setter getter.....
}
@Entity
@Table(name="customer_address")
public class CustomerAddess {
@Id
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = @org.hibernate.annotations.Parameter(name = "property", value = "customer"))
@Column(name="id")
public int getId() {
return id;
}
@Column(name="street_address")
public String getstreet_address() {
return street_address;
}
@OneToOne(fetch = FetchType.EAGER)
@PrimaryKeyJoinColumn
public Customer getCustomer() {
return customer;
}
//rest setter getter
我以您的示例为例,创建了两个简单的测试套件,可以让您概括了解如何持久化/更新/删除实体 我还稍微修改了您的实体(我不喜欢注释位于getter/setter之上,所以我将它们放在字段之上,并为getter/setter应用javabeans约定,并删除了一些拼写错误)。 这里有一些评论也可以给你一些提示 所有测试:
@OneToOne(mappedBy = "customer", cascade = CascadeType.ALL)
CustomerAddress customerAddress;
public class CascadeAllTests {
private EntityManager em;
@Before
public void before() {
final EntityManagerFactory emf = Persistence
.createEntityManagerFactory("pu");
em = emf.createEntityManager();
}
@After
public void after() {
em.close();
em = null;
}
@Test
public void persist() {
Customer c = new Customer();
c.setCustomerName("cName");
c.setPassword("cPass");
CustomerAddress addr = new CustomerAddress();
addr.setCustomer(c);
addr.setStreetAddress("Addr");
c.setCustomerAddress(addr);
em.getTransaction().begin();
em.persist(c); // it is not necessary to call em.persist(addr)
em.getTransaction().commit();
Customer cStored = em.find(Customer.class, c.getId());
assertNotNull(cStored);
assertEquals(c.getCustomerName(), cStored.getCustomerName());
assertEquals(addr.getStreetAddress(), cStored.getCustomerAddress()
.getStreetAddress());
}
@Test
public void update() {
Customer c = new Customer();
c.setCustomerName("cName");
c.setPassword("cPass");
CustomerAddress addr = new CustomerAddress();
addr.setCustomer(c);
addr.setStreetAddress("Addr");
c.setCustomerAddress(addr);
em.getTransaction().begin();
em.persist(c);
em.getTransaction().commit();
em.detach(c); // c and c.customerAddress are detached now.
addr.setStreetAddress("New address");
c.setCustomerName("New Name");
em.getTransaction().begin();
c = em.merge(c);
em.getTransaction().commit();
// due to CascadeType.ALL on Customer.customerAddress the new address is
// stored now
Customer cStored = em.find(Customer.class, c.getId());
assertNotNull(cStored);
assertEquals(c.getCustomerName(), cStored.getCustomerName());
assertEquals(addr.getStreetAddress(), cStored.getCustomerAddress()
.getStreetAddress());
}
@Test
public void deleteAddressOnly() {
Customer c = new Customer();
c.setCustomerName("cName");
c.setPassword("cPass");
CustomerAddress addr = new CustomerAddress();
addr.setCustomer(c);
addr.setStreetAddress("Addr");
c.setCustomerAddress(addr);
em.getTransaction().begin();
em.persist(c);
em.getTransaction().commit();
em.detach(c); // c and c.customerAddress are detached now
em.getTransaction().begin();
c = em.merge(c); // c and c.customerAddress are attached again
em.remove(c.getCustomerAddress());
c.setCustomerAddress(null);
em.getTransaction().commit();
// due to CascadeType.ALL on Customer.customerAddress the new address is
// stored now
Customer cStored = em.find(Customer.class, c.getId());
CustomerAddress addrStored = em.find(CustomerAddress.class,
addr.getId());
assertNotNull(cStored);
assertEquals(c.getCustomerName(), cStored.getCustomerName());
assertNull(cStored.getCustomerAddress());
assertNull(addrStored);
}
}
级联测试:
@OneToOne(mappedBy = "customer", cascade = {})
CustomerAddress customerAddress;
public class CascadeNonTests {
private EntityManager em;
@Before
public void before() {
final EntityManagerFactory emf = Persistence
.createEntityManagerFactory("pu");
em = emf.createEntityManager();
}
@After
public void after() {
em.close();
em = null;
}
@Test
public void persist() {
Customer c = new Customer();
c.setCustomerName("cName");
c.setPassword("cPass");
CustomerAddress addr = new CustomerAddress();
addr.setCustomer(c);
addr.setStreetAddress("Addr");
c.setCustomerAddress(addr);
em.getTransaction().begin();
em.persist(c);
em.persist(addr); // has to be called explicitly
em.getTransaction().commit();
Customer cStored = em.find(Customer.class, c.getId());
assertNotNull(cStored);
assertEquals(c.getCustomerName(), cStored.getCustomerName());
assertEquals(addr.getStreetAddress(), cStored.getCustomerAddress()
.getStreetAddress());
}
@Test
public void update() {
Customer c = new Customer();
c.setCustomerName("cName");
c.setPassword("cPass");
CustomerAddress addr = new CustomerAddress();
addr.setCustomer(c);
addr.setStreetAddress("Addr");
c.setCustomerAddress(addr);
em.getTransaction().begin();
em.persist(c);
em.persist(addr);// has to be called explicitly
em.getTransaction().commit();
em.detach(c);
em.detach(addr); // c and c.customerAddress are detached now.
addr.setStreetAddress("New address");
c.setCustomerName("New Name");
em.getTransaction().begin();
c = em.merge(c);
addr = em.merge(addr);
em.getTransaction().commit();
Customer cStored = em.find(Customer.class, c.getId());
assertNotNull(cStored);
assertEquals(c.getCustomerName(), cStored.getCustomerName());
assertEquals(addr.getStreetAddress(), cStored.getCustomerAddress()
.getStreetAddress());
}
@Test
public void deleteAddressOnly() {
Customer c = new Customer();
c.setCustomerName("cName");
c.setPassword("cPass");
CustomerAddress addr = new CustomerAddress();
addr.setCustomer(c);
addr.setStreetAddress("Addr");
c.setCustomerAddress(addr);
em.getTransaction().begin();
em.persist(c);
em.persist(addr);// has to be called explicitly
em.getTransaction().commit();
em.detach(c);
em.detach(addr); // c and c.customerAddress are detached now.
em.getTransaction().begin();
c = em.merge(c);
addr = em.merge(addr);
em.remove(c.getCustomerAddress());
c.setCustomerAddress(null);
em.getTransaction().commit();
Customer cStored = em.find(Customer.class, c.getId());
CustomerAddress addrStored = em.find(CustomerAddress.class,
addr.getId());
assertNotNull(cStored);
assertEquals(c.getCustomerName(), cStored.getCustomerName());
assertNull(cStored.getCustomerAddress());
assertNull(addrStored);
}
}
你在这里混合了Hibernate和JPA。您是如何定义映射的?每XML?有注解吗?您能添加您对客户/地址的定义吗?关于delete的问题:您可以查看EntityManager#remove方法。关于更新:只需在打开的事务中修改附加的实体。您可以使用EntityManager#merge重新附着分离的实体。我定义了带注释的映射。我们是否可以只使用entitymanager.merge和remove方法一次,如对customer和addressform都使用persist?这取决于您的映射(您可以搜索级联)。如果您编辑您的问题并提供映射,我可能可以帮助您。我添加了一些代码。。。我希望这足够了…是吗?