2013-08-29 7 views
0

Я пытаюсь использовать JBoss Tools 4.1 Hibernate плагин ради быстрого производства. но я получаю исключение на первом этапе.Я получаю org.hibernate.id.IdentifierGenerationException во многих отношениях во многих отношениях

В первую очередь физических таблиц БД следующим образом:

describe Teams ; 
Name       Null  Type                                       
ID        NOT NULL NUMBER                                               
NAME       NOT NULL VARCHAR2(20)                                             
COUNTRY      NOT NULL VARCHAR2(20) 

describe players; 
Name       Null  Type                                               
ID        NOT NULL NUMBER                                               
NAME       NOT NULL VARCHAR2(20)                                             
NATIONALITY     NOT NULL VARCHAR2(20) 

describe player_team; 
Name       Null  Type 
PLAYER_ID      NOT NULL NUMBER                                               
TEAM_ID      NOT NULL NUMBER 

Сущности следующим образом:

@Entity 
@Table(name = "PLAYERS") 
public class Players implements java.io.Serializable { 

private BigDecimal id; 
private String name; 
private String nationality; 
private Set<PlayerTeam> playerTeams = new HashSet<PlayerTeam>(0); 

@Id 
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0) 
public BigDecimal getId() { 
    return this.id; 
} 

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

@Column(name = "NATIONALITY", nullable = false, length = 20) 
public String getNationality() { 
    return this.nationality; 
} 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "players") 
public Set<PlayerTeam> getPlayerTeams() { 
    return this.playerTeams; 
} 
    // setters go here but i deleted for readability 

} 


@Entity 
@Table(name = "TEAMS") 
public class Teams implements java.io.Serializable { 

private BigDecimal id; 
private String name; 
private String country; 
private Set<PlayerTeam> playerTeams = new HashSet<PlayerTeam>(0); 

@Id 
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0) 
public BigDecimal getId() { 
    return this.id; 
} 

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

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

@Column(name = "COUNTRY", nullable = false, length = 20) 
public String getCountry() { 
    return this.country; 
} 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "teams") 
public Set<PlayerTeam> getPlayerTeams() { 
    return this.playerTeams; 
} 

    // setters go here 

} 

    @Embeddable 
    public class PlayerTeamId implements java.io.Serializable { 

private BigDecimal playerId; 
private BigDecimal teamId; 

@Column(name = "PLAYER_ID", nullable = false, precision = 22, scale = 0) 
public BigDecimal getPlayerId() { 
    return this.playerId; 
} 

public void setPlayerId(BigDecimal playerId) { 
    this.playerId = playerId; 
} 

@Column(name = "TEAM_ID", nullable = false, precision = 22, scale = 0) 
public BigDecimal getTeamId() { 
    return this.teamId; 
} 

public void setTeamId(BigDecimal teamId) { 
    this.teamId = teamId; 
} 

public boolean equals(Object other) { 
    if ((this == other)) 
     return true; 
    if ((other == null)) 
     return false; 
    if (!(other instanceof PlayerTeamId)) 
     return false; 
    PlayerTeamId castOther = (PlayerTeamId) other; 

    return ((this.getPlayerId() == castOther.getPlayerId()) || (this 
    .getPlayerId() != null && castOther.getPlayerId() != null && this 
      .getPlayerId().equals(castOther.getPlayerId()))) 
      && ((this.getTeamId() == castOther.getTeamId()) || (this 
        .getTeamId() != null && 
     castOther.getTeamId() != null && this        
     .getTeamId().equals(castOther.getTeamId()))); 
} 

public int hashCode() { 
    int result = 17; 

    result = 37 * result 
      + (getPlayerId() == null ? 0 : 
     this.getPlayerId().hashCode()); 
    result = 37 * result 
      + (getTeamId() == null ? 0 : this.getTeamId().hashCode()); 
    return result; 
} 

    } 

И затем я попытался вставить записи на таблицу соединения следующим образом:

  Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.getTransaction().begin();  
    Players pl = (Players) session.load(Players.class, new BigDecimal(2)); 
    Teams tm = (Teams) session.load(Teams.class, new BigDecimal(25)); 
    PlayerTeam pt = new PlayerTeam(); 
    pt.setPlayers(pl); 
    pt.setTeams(tm); 
    session.save(pt); 
    session.getTransaction().commit(); 

ликвидировано, получив следующее исключение:

org.hibernate.id.IdentifierGenerationException: null id generated for:class  
business.PlayerTeam 

Наконец hibernate.cfg.xml

<session-factory name="se"> 
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
    <property 
    name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property> 
    <property name="hibernate.connection.password">LECTURE1</property> 
    <property  
    name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 
    <property name="hibernate.connection.username">lecture1</property> 
    <property name="hibernate.default_schema">LECTURE1</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle8iDialect</property> 
    <mapping class="business.Players" /> 
    <mapping class="business.PlayerTeam" /> 
    <mapping class="business.Teams" /> 
    <property name="current_session_context_class">thread</property> 
    <property name="show_sql">true</property> 
</session-factory> 

Would you throw some light on this please ? thanks 

ответ

1

Каждый объект в Hibernate требует столбец ID с аннотацией @Id. Класс PlayerTeam не имеет такого столбца. Если ваш класс PlayerTeam - это просто таблица соединений, ему даже не нужно быть сущностью. Вы можете просто сделать:

public class Players { 

... 

@ManyToMany(mappedBy="players", fetch=FetchType.LAZY) 
private List<Teams> teams; 

... 

} 

public class Teams { 

... 

@ManyToMany(fetch=FetchType.LAZY) 
@JoinTable(name="player_team", joinColumns={@JoinColumn(name="TEAM_ID")}, inverseJoinColumns={@JoinColumn(name="PLAYER_ID")}) 
private list<Players> players; 

... 

} 

Эта установка будет двунаправленная многие-ко-многим с классом команды в качестве стороны имущего. Вы можете полностью избавиться от класса PlayerTeamId.

Как и в сторону, я настоятельно рекомендую ваши имена классов сингулярным (например, игрока и команды вместо игроков и команд)

+0

Я знаю, как сделать это без совместного стола. Но, как я сказал в своем вопросе, я хочу использовать плагин JBoss tools. JBoss генерирует 2 дополнительных класса. Плагин JBoss уже сгенерировал аннотацию @EmbeddedId в классе TeamPlayer. поэтому он должен работать. http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/ – Rehme

+1

Итак, из примера, с которым вы связались, «Инструменты Hibernate/JBoss сгенерировали аннотацию коды не работают в этом третьем сценарии дополнительных столбцов. Чтобы он работал, вы должны настроить код, чтобы использовать «@AssociationOverride», в StockCategory.java, чтобы отображать отношения «многие-многие». ». Вы пытались использовать @AssociationOverride? Я лично считаю, что этот инструмент создает слишком сложную структуру сущности, и это вызовет у вас головные боли в будущем. Я ожидал, что инструмент просто сгенерирует прямую @ManyToMany. – Pace

+0

Я не обращал слишком много внимания на @AssociationOverride. Теперь, после применения, он работает. Спасибо, сэр – Rehme

Смежные вопросы