- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 Hibernate 作为持久性提供程序并使用 JPA 2 为我的实体建模。
现在有一个问题出现了,我希望你能帮助我。
在我的应用程序中,您可以打开一个游戏,在其中创建玩家组并在 map 上四处走动(方 block (2d))。
首先是我的实体定义:游戏:
@Entity
public class Game implements Serializable {
@Id
@SequenceGenerator(name = "gen_gameid", sequenceName = "seq_gameid")
@GeneratedValue(generator="gen_gameid")
private long gameid;
/**
* Playing Characters.
*/
@OneToMany(mappedBy = "game")
private List<Character> characters;
private int round = 0;
@OneToMany(mappedBy="game")
private List<Tile> tiles;
@OneToMany(mappedBy="game")
private List<Group> group;
图 block (图 block 将从模板创建并且只属于一个游戏):
@Entity @IdClass(TileId.class)
public class Tile implements Serializable{
private static final long serialVersionUID = 2039974286110729270L;
@Id
private int x;
@Id
private int y;
@Id @ManyToOne @JoinColumn(name="gameid")
private Game game;
@OneToOne(mappedBy="tile")
private Character character;
}
字符:
@ManyToOne
@JoinColumn(name="gameid", referencedColumnName = "gameid")
private Game game;
@ManyToOne
@JoinColumns({
@JoinColumn(name="groupgameid", referencedColumnName = "gameid"),
@JoinColumn(name="groupTag", referencedColumnName = "grouptag")
})
private Group group;
@OneToOne
@JoinColumns({
@JoinColumn(name = "x", referencedColumnName = "x"),
@JoinColumn(name = "y", referencedColumnName = "y"),
@JoinColumn(name = "tilegameid", referencedColumnName = "gameid")
})
private Tile tile;
如您所见,我不得不将 gameid 列重命名为 groupgameid 和 tilegameid。这不是很漂亮,因为我只需要角色中的 gameid 一次。要使用 insertable=false、updateable=false 标记来自 tile 和组的字符中的 fk 列,updateable=false 将允许生成 sql,但我无法更改/设置此值。
当然,我可以在组和图 block 中引入人工 pk,但我需要更多连接。
JPA 是否仅限于我必须允许 gameid 列多次使用其他名称?还是我的设计不是最优的?
期待您的反馈并提前致谢。问候马库斯
附言(编辑):目前,我让 shema 在启动时通过 hibernate 生成,直到我的模型完成。但这是生成的 shema(稍微简化并删除了一些不重要的字段):
CREATE TABLE Character
(
charid bigint NOT NULL,
gameid bigint,
grouptag character varying(255),
x integer,
y integer,
CONSTRAINT hero_pkey PRIMARY KEY (charid),
CONSTRAINT fkd4addb09308bc3b822441a FOREIGN KEY (gameid)
REFERENCES game (gameid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fkd4addb093091cb6522441a FOREIGN KEY (gameid, x, y)
REFERENCES tile (gameid, x, y) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fkd4addb09c018f3ae22441a FOREIGN KEY (gameid, grouptag)
REFERENCES gamegroup (gameid, grouptag) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE tile (
x integer NOT NULL,
y integer NOT NULL,
gameid bigint NOT NULL,
CONSTRAINT tile_pkey PRIMARY KEY (gameid, x, y),
CONSTRAINT fk27c6ce308bc3b8 FOREIGN KEY (gameid)
REFERENCES game (gameid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION)
CREATE TABLE gamegroup
(
grouptag character varying(255) NOT NULL,
gameid bigint NOT NULL,
CONSTRAINT gamegroup_pkey PRIMARY KEY (gameid, grouptag),
CONSTRAINT fk3c1c51cd308bc3b8 FOREIGN KEY (gameid)
REFERENCES game (gameid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
PS 2:我已经尝试过 , insertable = false, updatable = false
。例如,当我将组 JoinColumns 更改为:
@ManyToOne
@JoinColumns({
@JoinColumn(name="gameid", referencedColumnName = "gameid", insertable = false, updatable = false ),
@JoinColumn(name="groupTag", referencedColumnName = "grouptag")
})
private Group group;
我收到不允许混合的错误消息: 由以下原因引起:org.hibernate.AnnotationException:不允许在属性中混合可插入列和不可插入列:net.hq.model.Charactergroup
当我同时设置 insertable=false 时,我无法再设置组标签。它的 groupTag 在插入和 gameid 设置后保持为空。 :-/
我将角色添加到组的方式:
// Create game
Game game = new Game();
game.addCharacter(max);
em.persist(game);
// Group
Group heroGroup = new Group(game, "HEROES");
heroGroup.addCharacter(max);
em.persist(game);
组类中的方法:
public void addCharacter(Character character){
if(this.characters == null)
this.characters = new ArrayList<Character>();
this.characters.add(character);
character.setGroup(this);
}
最佳答案
你需要这样做:
@ManyToOne
@JoinColumns({
@JoinColumn(name="gameid", referencedColumnName = "gameid", insertable = false, updatable = false ),
@JoinColumn(name="groupTag", referencedColumnName = "grouptag", insertable = false, updatable = false)
})
private Group group;
编辑:如评论中所述,@JoinColumn
是一个不需要包装的可重复注释(自 Java 8 起)。这简化了解决方案:
@ManyToOne
@JoinColumn(name="gameid", referencedColumnName = "gameid", insertable = false, updatable = false ),
@JoinColumn(name="groupTag", referencedColumnName = "grouptag", insertable = false, updatable = false)
private Group group;
关于java - JPA 2 : multiple column usage in foreign keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705088/
仍在习惯正则表达式中的环视,但似乎无法理解 \b(?>! key)foreign\b 要成为正确的解决方案?我试图在某些文本中找到所有外来词的实例,但不是外键或外键。 最佳答案 前瞻需要在 forei
我有一个外国表,例如: CREATE FOREIGN TABLE film ( id varchar(40) NOT NULL, title varcha
我的意思是例如我可以创建表 create table XTable ( idt int not null primary key, value nvarchar(50), idq int,
我有以下表格: 财务: PK_FinancialID FK_SchoolID 学校: PK_SchoolID 类: PK_ClassID FK_SchoolID 类(class)名 Class 和 F
我有一个旧数据库,我不能用每个实体中具有外键属性的两个实体更改它: EntityOne ForeignKey1 (pointing to EntityTwo.ForeignKey2) Enti
当我尝试运行代码时,出现此错误 Cannot add or update a child row: a foreign key constraint fails (hotel_info.results
好的,我尝试了这种从外国翻译过来的方法,它确实有效我在我的库中的 structs.lisp 文件中定义了这些,它在我所有其他依赖项之前首先加载 (cffi:defcstruct (cv-size :c
我有一个 Django 程序员的问题应该很简单,但目前我不知道如何解决。 我有这三个模型(我尽量简化): class Nations(models.Model): label = models
真的很讨厌占用别人的时间,但问题似乎并没有消失。 我考虑了 http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-t
我需要一双新的眼睛来看看我到底做错了什么。 CREATE TABLE IF NOT EXISTS `spring_normalize`.`users` ( `username` VARCHAR(6
我正在尝试在表中添加外键约束。我的表结构是:表请购单 我想在下一张表中添加申请表的外键 申请批准 当我尝试使用以下 SQL 查询添加外键约束时: ALTER TABLE `requisition_ap
每当我尝试将数据插入“学生”表时,都会收到此错误。下面是两个表,我使用的是MySql: 学生表: | Field | Type | Null | Key | Defaul
我收到错误代码 1215:无法为子表添加外键约束。父表具有复合主键。我想使用该复合主键作为子表中的外键。请指导我。 父表 CREATE TABLE health.procedures( Spe
var state = require('./state') module.exports = function (sequelize, DataTypes) { var city = seq
我可以通过 this case 部分解决这个问题 不幸的是,Preload() 函数似乎无法在相关对象集中进行更深入的研究。 澄清一下,我有以下模型: type Room struct {
我正在使用 Laravel 6。我创建了一些迁移,但我无法让它们成功运行。这些是我的迁移。 public function up() { Schema::create('nationa
这是我的总输出: Executing SQL script in server ERROR: Error 1215: Cannot add foreign key constraint CREATE
我有 postgres 数据库,我的应用程序是使用 django 构建的,我使用 south migration 来维护数据库模式。我有以下场景: user_table与userclickstream
简单的问题。只是想知道是否可以在不需要我在 Java 代码中手动强制执行此约束的情况下完成此操作。这两个外键(一起在同一个表中)都引用另一个表,但对于每一行,它们不得指向同一个外项。 link tex
我正在为我的模型关联使用 Sails 和 Waterline,但我不确定要做什么才能修复我在尝试更新 PageChild 对象时收到的错误。 module.exports = { tableN
我是一名优秀的程序员,十分优秀!