EJB3.0 一对一映射 报不能找到实体bean错误

cmnong 2011-11-14 03:47:04
做了一个EJB,使用EJB3.0 + JPA
然后部署成ear文件。
单表的时候,可以persist()。
但是两个表,通过外键关联后,通过一对一映射,不管持久化那个实体bean,都不能找到JPA对应的实体bean。

使用 的数据库是MySQL

persistence.xml为


<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="YingShe_PU">
<jta-data-source>java:/yingshe_MySqlDS</jta-data-source>
<class>huizhi.entity.Person</class>
<class>huizhi.entity.Card</class>
</persistence-unit>
</persistence>


实体bean代码

1、Person

package huizhi.entity;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="person")
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String address;
private int age;
private String name;
private String phone;
private Card card;

public Person() {
}


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false)
public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}


@Column(length=50)
public String getAddress() {
return this.address;
}

public void setAddress(String address) {
this.address = address;
}


public int getAge() {
return this.age;
}

public void setAge(int age) {
this.age = age;
}

@Column(nullable=false, length=20)
public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}


@Column(length=15)
public String getPhone() {
return this.phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

//bi-directional one-to-one association to Card
@OneToOne(cascade={CascadeType.REFRESH})
@JoinColumn(name="cardid", referencedColumnName="cid")
public Card getCard() {
return this.card;
}

public void setCard(Card card) {
this.card = card;
}

}


2、card实体代码

package huizhi.entity;

import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="card")
public class Card implements Serializable {
private static final long serialVersionUID = 1L;
private String cid;
private Date valDate;
private Person person;

public Card() {
}


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="Cid", unique=true, nullable=false, length=18)
public String getCid() {
return this.cid;
}

public void setCid(String cid) {
this.cid = cid;
}


@Temporal( TemporalType.DATE)
@Column(name="ValDate", nullable=false)
public Date getValDate() {
return this.valDate;
}

public void setValDate(Date valDate) {
this.valDate = valDate;
}

//bi-directional one-to-one association to Person
@OneToOne(mappedBy="card", cascade={CascadeType.MERGE, CascadeType.REMOVE}, optional=false)
public Person getPerson() {
return this.person;
}

public void setPerson(Person person) {
this.person = person;
}

}


3、会话bean调用部分

@PersistenceContext(unitName="YingShe_PU")protected EntityManager em;
public void addPerson(String name, int age, String phone, String address, String cid, Date valDate) {
Person p = new Person();
Card c = new Card();
c.setCid(cid);
c.setValDate(valDate);
c.setPerson(p);
p.setId(1);
p.setName(name);
p.setAddress(address);
p.setAge(age);
p.setPhone(phone);
p.setCard(c);
try{
//em.persist(c);
em.persist(p);
}catch(Exception e){
System.err.println(e.getMessage());
}
}


4、客户端

<%
DateFormat format= new SimpleDateFormat("yyyy-MM-dd");

InitialContext ctx = new InitialContext();
PersonbeanLocal pl = (PersonbeanLocal)ctx.lookup("Personbean");
out.println("<br>---------------添加个人信息------------<br>");

//添加一个个人信息
pl.addPerson("李小婉",20,"13526606880","北京市朝阳区安定路","410182198807189875",format.parse("2020-12-12"));

%>
...全文
62 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeeJah163 2011-11-15
  • 打赏
  • 举报
回复
不要用那些映射、外键之类的,就作为独立的表,查询自己写QL,外键维护起来麻烦容易出错~
cmnong 2011-11-15
  • 打赏
  • 举报
回复
别让沉贴呀,高手快帮忙,分析一下
谢谢
cmnong 2011-11-15
  • 打赏
  • 举报
回复
就是上面说的问题
把另一个工程移除后,就报下面的异常了:

16:52:54,765 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
org.hibernate.PersistentObjectException: detached entity passed to persist: huizhi.entity.Person
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:102)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:645)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:619)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:623)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220)
at org.jboss.jpa.tx.TransactionScopedEntityManager.persist(TransactionScopedEntityManager.java:187)
at huizhi.sessionbean.Personbean.addPerson(Personbean.java:37)
cmnong 2011-11-15
  • 打赏
  • 举报
回复
可能是我吧两个不同工程打包到一个ear,而这两个不同的工程使用到的parsistecne 对应 persistence-unit 属性都是一样引起的,先调试一下吧!
cmnong 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leejah163 的回复:]
不要用那些映射、外键之类的,就作为独立的表,查询自己写QL,外键维护起来麻烦容易出错~
[/Quote]


你是说用JDBC吗?
cmnong 2011-11-14
  • 打赏
  • 举报
回复
咋这里,最怕的是什么,就是沉贴,千万别沉哦。

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧