Java. Hibernate. foreign key

261
13 марта 2017, 09:00

Есть 2 таблицы в БД.

1)users (id, name, login, password)
2)MessageSystem(id, from_id, to_id .....)

Поля from_id, to_id являются внешними ключами и ссылаются на id у users.

Вот собственно, что он мне пишет:

org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: DataBaseService.dataSets.UsersDataSet.messageDataSet[DataBaseService.dataSets.MessageDataSet]

Код файла UsersDataSet.java

    import javax.persistence.*;
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    @Entity
    @Table(name = "users")
    public class UsersDataSet implements Serializable {
        private static final long serialVersionUID = -8706689714326132798L;
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
        @Column(name = "name", updatable = false, unique = true)
        private String name;
        @Column(name = "login", updatable = false, unique = true)
        private String login;
        @Column(name = "password", updatable = false)
        private String password;
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "fromId")
        private Set<MessageDataSet> sendMessage = new HashSet<MessageDataSet>(0);
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "toId")
        private Set<MessageDataSet> receivedMessage = new HashSet<MessageDataSet>(0);

//setters getters....

Код файла MessageDataSet.java

import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "messagesystem")
public class MessageDataSet implements Serializable {
    @Id
    @Column(name = "id_msg")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id_msg;
    @Column(name = "body_msg")
    private String body_msg;
    @Column(name = "date_msg")
    private String date_msg;
    @Column(name = "sender_del")
    private boolean sender_del;
    @Column(name = "receiver_del")
    private boolean receiver_del;
    @Column(name = "receiver_view")
    private boolean receiver_view;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "from_id")
    private UsersDataSet fromId;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "to_id")
    private UsersDataSet toId;
    //setters getters...
Answer 1

Скорее всего одна из сущностей просто не упомянута в hibernate.cfg.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        ...
        <mapping class="com.example.domain.User"/>
        <mapping class="com.example.domain.Message"/>
    </session-factory>
</hibernate-configuration>

Кроме того, у вас очень много лишнего в классах сущностей и вам стоит поработать над стилем:

  1. Имя класса сущности принято писать в единственном числе - User, Message.
  2. Имена переменных в Java принято писать в lowerCamelCase - не body_msg, а bodyMsg.
  3. Анотации Hibernate следуют принципу configuration by exception. То есть бóльшую часть анотаций надо писать только тогда, когда не устраивает поведение по умолчанию.
  4. В частности поля типа OneToMany ленивые по умолчанию.
  5. Зачем вам сериализация? Вы используете её где-то ещё?
  6. Зачем вы присваиваете пустой HashSet полям, значения которых всё равно будут внедряться?

Вполне достаточно будет этого:

import java.util.Set;
import java.util.Date;
import javax.persistence.*;
@Entity
public class User {
    @Id
    @GeneratedValue
    Long id;
    @Column(nullable = false, updatable = false, unique = true)
    private String login;
    @Column(nullable = false)
    private String password;
    @Column
    private String name;
    @OneToMany
    @OrderBy("sent")
    private Set<Message> sentMessages;
    @OneToMany
    @OrderBy("sent")
    private Set<Message> receivedMessages;
    public User() {}
    public User(String login, String password) {
        setLogin(login);
        setPassword(password);
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getLogin() {
        return login;
    }
    public void setLogin(String login) {
        this.login = login;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return getLogin();
    }
}

@Entity
public class Message {
    @Id
    @GeneratedValue
    Long id;
    @Temporal(TemporalType.TIMESTAMP)
    private Date sent;
    @Column(nullable = false)
    String text;
    @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    private User from;
    @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    private User to;
    public Message() {}
    public Message(User from, User to, String text) {
        this.from = from;
        this.to = to;
        this.text = text;
        this.sent = new Date();
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    // ... Остальные геттеры и сеттеры
    @Override
    public String toString() {
        return "Message from " + from + " to " + to + ": " + getText();
    }
}
READ ALSO
Ошибка unreachable statement

Ошибка unreachable statement

Прохожу урок на StartAndroid, возникла ошибка в коде, не могу понять как исправить, нужный класс импортирован, всё переписал как в примере, помогите...

391
Браузер уменьшает толщину border?

Браузер уменьшает толщину border?

Здравствуйте! У меня такая проблема: браузер Chrome отображает ширину border у html элементов не такую, как задана в стилях, а уменьшенную в 08 раз

278
Как задать константу в padding ссылки

Как задать константу в padding ссылки

У меня есть константа объявленная как

322
Как изменить input по кнопке

Как изменить input по кнопке

У меня есть страница html, на ней кнопка submit

345