2012-04-04 5 views
1

Я хочу сохранить атрибуты на ассоциативной таблице в спящем режиме и не знаю, как это сделать.Как сохранить атрибуты в ассоциативной таблице с помощью JPA и Hibernate?

Я придумал следующий пример: у меня есть таблица USERS, таблица MEDIA (где хранятся фильмы и книги) и ассоциативная таблица USER_MEDIA, где я храню, если ПОЛЬЗОВАТЕЛЬ «видел» СМИ и рейтинг заданный пользователем.

Проблема: отображение скорости. Я использовал XML для выполнения сопоставления, хотя я также могу использовать аннотации, если это облегчит вам работу.

Ниже приведены мои фрагменты кода:

create table USER(
    UUID bigint not null auto_increment, 
    NAME text, 
    primary key (UUID) 
); 

create table MEDIA(
    MEDIAID bigint not null auto_increment, 
    NAME text, 
    primary key (MEDIAID) 
); 

create table USER_MEDIA(
    UUID bigint not null, 
    MEDIAID bigint not null, 
    RATE double, 
    RATE_FORMAT varchar(2), 
    primary key (UUID, MEDIAID) 
); 

alter table USER_MEDIA add foreign key (UUID) REFERENCES USER(UUID); 
alter table USER_MEDIA add foreign key (MEDIAID) REFERENCES MEDIA(MEDIAID); 

JAVA

public class User { 
    private Long id; 
    private String name; 
    private Double rating; 
    private String ratingFormat; 
    private Set<Media> medias = new HashSet<Media>(); 
    //getters e setters 
} 

public class Media { 
    private Long id; 
    private String name; 
    private Double rate; 
    private String rateFormat; 
    private Set<User> users = new HashSet<User>(); 
    //getters e setters 
} 

hbm.xml

<hibernate-mapping package="package.model"> 

    <class name="User" table="USER"> 
     <id name="id" column="UUID"> 
     <generator class="native" /> 
     </id> 
     <property name="name" type="text" /> 
     <set name="medias" table="USER_MEDIA" cascade="all"> 
     <key column="UUID" /> 
     <many-to-many column="MEDIAID" class="package.model.Media" /> 
     </set>  
    </class> 

    <class name="Media" table="MEDIA"> 
     <id name="id" column="MEDIAID"> 
     <generator class="native" /> 
     </id>   
     <property name="name" type="text" /> 
     <property name="rate" type="double" /> 
     <property name="rateFormat" type="text" column="RATE_FORMAT" />  
     <set name="users" table="USER_MEDIA" cascade="all"> 
     <key column="MEDIAID" /> 
     <many-to-many column="UUID" class="package.model.User" /> 
     </set>   
    </class> 
</hibernate-mapping> 
+0

Я не уверен, что не так в вашем коде, можете ли вы быть более конкретным. И я думаю, что аннотации намного проще. – mbaydar

ответ

0

Я сделал то же самое для пользователей и групп, но с помощью аннотаций, проверка если полезна для вас

package net.smanne.account.domain; 

import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.JoinTable; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToMany; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.codehaus.jackson.annotate.JsonIgnore; 

import net.smanne.core.domain.CoreEntity; 

@Entity(name="accounts") 
@XmlRootElement 
public class Account extends CoreEntity { 

    private String name; 
    private String password; 
    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name="account_groups", 
    [email protected](name="account_id"), 
    [email protected](name="group_id")) 
    private List<Group> group; 

    public String getName() { 
     return name; 
    } 

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

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public List<Group> getGroups() { 
     return group; 
    } 

    public void setGroups(List<Group> groups) { 
     this.group = groups; 
    } 
} 

//Group.java 
package net.smanne.account.domain; 

import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.ManyToMany; 
import javax.xml.bind.annotation.XmlRootElement; 

import net.smanne.core.domain.CoreEntity; 

@Entity(name="groups") 
@XmlRootElement 
public class Group extends CoreEntity { 

    private String name; 
    private String description; 

    /*@ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="account_groups", 
    [email protected](name="group_id"), 
    [email protected](name="account_id")) 
    private List<Account> accounts;*/ 

    public String getName() { 
     return name; 
    } 

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

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    /*public List<Account> getAccounts() { 
     return accounts; 
    } 

    public void setAccounts(List<Account> accounts) { 
     this.accounts = accounts; 
    }*/ 
} 
+0

спасибо за попытку помочь, хотя я не вижу, как пример относится к исходной проблеме (которая является постоянными атрибутами в ассоциативной таблице) – Pomario