Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA不维护连接_Java_Jpa_Eclipselink - Fatal编程技术网

Java JPA不维护连接

Java JPA不维护连接,java,jpa,eclipselink,Java,Jpa,Eclipselink,因此,看起来一旦程序结束,对象连接就不会持久化。让我用一个简单的例子来解释: //将朋友添加到个人并“发送”给该朋友一条消息 em.getTransaction().begin(); Friend person = new Friend(); person.setName("One"); Friend friend = new Friend(); friend.settName("Two"); Message messageToFriend = new Message(); message

因此,看起来一旦程序结束,对象连接就不会持久化。让我用一个简单的例子来解释:

//将朋友添加到个人并“发送”给该朋友一条消息

em.getTransaction().begin();

Friend person = new Friend();
person.setName("One");

Friend friend = new Friend();
friend.settName("Two");

Message messageToFriend = new Message();
messageToFriend.setMessage("Hi");

friend.getMessages().add(messageToFriend);

person.getFriends().add(friend);

em.persist(person);

em.getTransaction().commit();
//测试代码:

Query q = em.createQuery("select f from Friend f where f.name = 'One'");
List<Friend> personList = q.getResultList();

Friend retrievedPerson = personList.get(0);

System.out.println("Friend size: "+retrievedPerson.getFriends().size());
if(retrievedPerson.getFriends().size() > 0){
    List<Message> messagesToFriend = retrievedPerson.getFriends().get(0).getMessages();

    System.out.println("Friend message size: "+messagesToFriend.size());

    if(messagesToFriend.size() > 0){
        System.out.println("Message to "+retrievedPerson.getFriends().get(0).getName()+": "+messagesToFriend.get(0).getMessage());
    }
}
Query q=em.createQuery(“从Friend f中选择f,其中f.name='One'”);
List personList=q.getResultList();
Friend retrievedPerson=personList.get(0);
System.out.println(“好友大小:+retrievedPerson.getFriends().size());
如果(retrievedPerson.getFriends().size()>0){
List messagesToFriend=retrievedPerson.getFriends().get(0.getMessages();
System.out.println(“好友消息大小:+messagesToFriend.size());
如果(messagesToFriend.size()>0){
System.out.println(“发送给“+retrievedPerson.getFriends().get(0).getName()+”:“+messagesToFriend.get(0).getMessage()”);
}
}
这将按预期打印:

朋友人数:1

好友信息大小:1

留言二:嗨

但一旦程序结束,我再次尝试测试代码:

好友大小:0

如果我查询所有的朋友,我会同时得到两个朋友:一个和两个,但是这两个朋友之间的联系消失了。甚至好友上的消息也不见了(尽管它仍然在数据库中,查询消息会得到消息)

为什么对象之间的连接会丢失

我正在使用MySQL和EclipseLink

附加代码:

 @Entity
    public class Friend {

        @Id
        @GeneratedValue(strategy = GenerationType.TABLE)
        public String id;

        private String name;

        @OneToMany(mappedBy="parentFriend", cascade = CascadeType.PERSIST)
        private List<Friend>friends = new ArrayList<Friend>();

        @ManyToOne
        private Friend parentFriend;

        @OneToMany(mappedBy="friend", cascade = CascadeType.PERSIST)
        private List<Message>messages = new ArrayList<Message>();

        public List<Message>getMessages(){
            return messages;
        }

        public List<Friend>getFriends(){
            return friends;
        }

        public String getName() {
            return name;
        }

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

    }

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private String id;

    @ManyToOne
    private Friend friend;

    private String message;

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}
@实体
公课朋友{
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
公共字符串id;
私有字符串名称;
@OneToMany(mappedBy=“parentFriend”,cascade=CascadeType.PERSIST)
private Listfriends=new ArrayList();
@许多酮
私人朋友;
@OneToMany(mappedBy=“friend”,cascade=CascadeType.PERSIST)
private Listmessages=new ArrayList();
公共ListgetMessages(){
返回消息;
}
公共列表GetFriends(){
回报朋友;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
@实体
公共类消息{
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
私有字符串id;
@许多酮
私人朋友;
私有字符串消息;
公共字符串getMessage(){
返回消息;
}
公共无效设置消息(字符串消息){
this.message=消息;
}
}

提交后可能需要em.flush()。JPA不能保证数据何时真正持久化到数据库。我相信em.flush()方法会显式地保留它,前提是您还不想关闭实体管理器。

很抱歉,在再次查看您的问题后,我恐怕回答不正确。我认为问题在于你的代码没有交叉链接friends和parentFriend字段。您的代码应该更像:

Friend a = new Friend();
Friend b = new Friend();
a.getFriends().add(b);
b.setParentFriend(a);
如果没有设置这两个字段,链接就不会发生,即使使用持久级联