Не удалось сохранить отношения самообращения ManyToMany в спящем режиме - PullRequest
1 голос
/ 19 октября 2011

У меня есть связь ManyToMany между person , которую я пытаюсь описать с помощью аннотаций Hibernate.Я также создал тест для этого, но проблема в том, что отношения не сохраняются.Пожалуйста, помогите мне найти, где я ошибся!

Entity:

@Entity(name = "person")
@Table(appliesTo = "person", indexes = {
        @org.hibernate.annotations.Index(name = "ix_uuid", columnNames = {"uuid"}),
        @org.hibernate.annotations.Index(name = "ix_facebookId", columnNames = {"facebookId"})
})
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private String uuid;
    private String firstName;
    private String lastName;
    private String facebookId;
    private String email;


    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "person_friend",
            joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "friend_id", referencedColumnName = "id")
    )
    private Set<Person> persons = new HashSet<Person>();

    @ManyToMany(mappedBy = "persons", cascade = CascadeType.ALL)
    private Set<Person> friends = new HashSet<Person>();


    public Person(String uuid, String firstName, String lastName, String facebookId, String email) {
        this.uuid = uuid;
        this.firstName = firstName;
        this.lastName = lastName;
        this.facebookId = facebookId;
        this.email = email;
    }

    public Person() {
        // Hibernate
    }

    public Long getId() {
        return id;
    }

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

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFacebookId() {
        return facebookId;
    }

    public void setFacebookId(String facebookId) {
        this.facebookId = facebookId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void addFriend(Person person){
        if(!getFriends().contains(person)){
            getFriends().add(person);
            person.getPersons().add(this);
        }
    }

    public void becomeFriendOf(Person person) {
        if(!getPersons().contains(person)){
            getPersons().add(person);
            person.getFriends().add(this);
        }
    }

    public Set<Person> getFriends() {
        return friends;
    }

    public void setFriends(Set<Person> friends) {
        this.friends = friends;
    }

    public Set<Person> getPersons() {
        return persons;
    }

    public void setPersons(Set<Person> persons) {
        this.persons = persons;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", uuid='" + uuid + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", facebookId='" + facebookId + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

PersonDao:

@Repository("personDao")
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao {

    @Autowired
    public PersonDaoImpl(SessionFactory sessionFactory) {
        setSessionFactory(sessionFactory);
    }

    @Override
    public void save(Person person) {
        getSession().save(person);
    }

    @Override
    public Person getPerson(Long id) {
        return (Person) getSession().get(Person.class, id);
    }

    @Override
    public void saveFriendship(Friendship friendship) {
        getSession().save(friendship);
    }

}

Тест:

@Test(groups = {"integration"})
@ContextConfiguration(locations = {"classpath:applicationContext-test.xml" })
public class PersonDaoImplTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private PersonDao target;


    @Test
    public void loadDatabaseWithSomeInitialValues(){

        System.out.println(applicationContext.toString());

        Person person = new Person("12345abcde","test","test2","test.test", "test.test@gmail.com");
        Person person2 = new Person("4567abcde","fest","fest","fest.fest", "fest.fest@gmail.com");
        Person person3 = new Person("89105abcde","best","best","best.best", "best.best@gmail.com");

        person.addFriend(person2);
        person.addFriend(person3);

        person2.becomeFriendOf(person);
        person3.becomeFriendOf(person);

        target.save(person);
    }    
    }
}

Как указано, лица сохраняются в таблице person , но не взаимосвязи в таблице person_friend .Почему?

1 Ответ

0 голосов
/ 19 октября 2011

Возможно, это как-то связано с границами транзакций. Попробуйте сделать свой метод испытаний @Transactional.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...