我的数据库包含3个表:用户和服务实体具有多对多关系,并与SERVICE_USER表连接,如下所示:
用户 - SERVICE_USER - 服务
SERVICE_USER表包含其他BLOCKED列.
执行此类映射的最佳方法是什么?这些是我的实体类
@Entity
@Table(name = "USERS")
public class User implements java.io.Serializable {
private String userid;
private String email;
@Id
@Column(name = "USERID", unique = true, nullable = false,)
public String getUserid() {
return this.userid;
}
.... some get/set methods
}
@Entity
@Table(name = "SERVICES")
public class CmsService implements java.io.Serializable {
private String serviceCode;
@Id
@Column(name = "SERVICE_CODE", unique = true, nullable = false, length = 100)
public String getServiceCode() {
return this.serviceCode;
}
.... …
Run Code Online (Sandbox Code Playgroud) 我已经浏览了许多SO
和google
帖子来生成has many and belongs to many
关联的连接表的迁移,没有任何工作.
所有解决方案都生成一个空的迁移文件.
我正在使用rails 3.2.13
,我有两张桌子:security_users
和assignments
.这些是我尝试过的一些事情:
rails generate migration assignments_security_users
rails generate migration create_assignments_security_users
rails generate migration create_assignments_security_users_join_table
rails g migration create_join_table :products, :categories (following the official documentation)
rails generate migration security_users_assignments security_user:belongs_to assignments:belongs_to
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉如何在两个表之间创建连接表迁移吗?
migration ruby-on-rails jointable ruby-on-rails-3 ruby-on-rails-4
如何在Doctrine 2中设置具有额外列的连接表,或与其他属性的多对多关联?
我有两个表之间的父/子关系,以及我的Java类中的相应映射.表大致如下:
A (ref number, stuff varchar2(4000))
B (a_ref number, other number, foo varchar2(200))
Run Code Online (Sandbox Code Playgroud)
和Java代码:
@Entity
class A {
@Id
@Column(name = "REF")
private int ref;
@OneToMany
@JoinColumn(name = "A_REF", referencedName = "REF")
private Set<B> bs;
}
@Entity
class B {
@Id
@Column(name = "A_REF")
private int aRef;
@Id
@Column(name = "OTHER")
private int other;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想在从子表中检索的行上添加一个过滤器.生成的查询如下所示:
select a_ref, other, foo from B where a_ref = ?
Run Code Online (Sandbox Code Playgroud)
我希望它是:
select a_ref, other, foo from B where a_ref = ? and other = …
Run Code Online (Sandbox Code Playgroud) 我有两个表和一个联接表:'staff','classification'和'staff_classification'.在连接表中,我有一个额外的布尔字段:'showclassification'.我的注释如下:
/**
* @ManyToMany(targetEntity="Staff", inversedBy="classifications")
* @JoinTable(name="staff_classifications",
* joinColumns={@JoinColumn(name="staffid", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="classificationid", referencedColumnName="id", unique=true)});
*/
Run Code Online (Sandbox Code Playgroud)
我在这里有一个数据库,其中PERSON
- ADDRESS
- ADDRESS_TYPE
关系由三联接表维护PERSON_ADDRESS
.本PERSON
- ADDRESS
关系实际上是一个一对多的.
PERSON
ID FIRSTNAME LASTNAME -- --------- -------- 1 John Doe 2 Jane Doe
ADDRESS
ID STREET CITY -- -------------------- ------------- 1 Home Street 1 Hometown 2 Office Street 1 Officetown 3 Main Street 1 Maintown 4 Business Building 1 Businesstown
ADDRESS_TYPE
ID NAME -- --------------- 1 Home Address 2 Office Address
PERSON_ADDRESS
PERSON_ID ADDRESS_TYPE_ID ADDRESS_ID --------- --------------- ---------- 1 1 1 1 2 2 2 1 3 …
能否帮助我如何使用一个公共连接表连接三个表?我有USER,APPLICATION和ROLE表.我希望将他们的ID加入名为USER_APP_ROLE(user.ID,application.ID,role.ID)的表中.
当我删除Join Many to Many中的Application或Role表时,我的代码正在运行.
我做了以下代码:
User.java
@ManyToMany (targetEntity=Role.class)
@JoinTable(name="USER_APPLICATION_ROLE",
joinColumns=@JoinColumn(name="USER_ID"),
inverseJoinColumns=@JoinColumn(name="ROLE_ID"))
private Collection<Role> roles;
@ManyToMany (targetEntity=Application.class)
@JoinTable(name="USER_APPLICATION_ROLE",
joinColumns=@JoinColumn(name="USER_ID"),
inverseJoinColumns=@JoinColumn(name="APPLICATION_ID"))
private Collection<Application> applications;
Run Code Online (Sandbox Code Playgroud)
Role.java
@ManyToMany(mappedBy="roles", targetEntity=User.class)
private Collection<User> users = new ArrayList<User>();
Run Code Online (Sandbox Code Playgroud)
Application.java
@ManyToMany(mappedBy="applications", targetEntity=User.class)
private Collection<User> users = new ArrayList<User>();
Run Code Online (Sandbox Code Playgroud)
当我尝试运行以下测试时:
user.getRoles().add(role1);
user.getRoles().add(role2);
role1.getUsers().add(user);
role1.getUsers().add(user);
role2.getUsers().add(user);
role2.getUsers().add(user);
user.getApplications().add(app1);
user.getApplications().add(app2);
app1.getUsers().add(user);
app2.getUsers().add(user);
......
session.beginTransaction();
session.save(user);
session.save(role1);
session.save(role2);
session.save(app1);
session.save(app2);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Hibernate: select seq_cm_user.nextval from dual
Hibernate: select seq_role.nextval from dual
Hibernate: select seq_role.nextval from dual
Hibernate: select seq_application.nextval from dual …
Run Code Online (Sandbox Code Playgroud) 这些是我的模特:
class Product
has_many :line_items
has_many :orders, :through => :line_items
end
class LineItem
belongs_to :order
belongs_to :product
end
class Order
has_many :line_items
has_many :products, :through => :line_items
end
Run Code Online (Sandbox Code Playgroud)
来自schema.rb:
create_table "line_items", id: false, force: true do |t|
t.integer "order_id"
t.integer "product_id"
t.integer "quantity"
t.datetime "created_at"
t.datetime "updated_at"
end
Run Code Online (Sandbox Code Playgroud)
我刚刚升级到Rails 4,我的连接表停止工作.如果我这样做@order.line_items
,它会抛出异常"模型LineItem中表line_items的未知主键".@order.products
按预期工作.
我已经尝试删除并重新创建line_items表,我已经尝试安装protected_attributes gem,但没有任何改变.
这是痕迹.
activerecord ruby-on-rails exception jointable ruby-on-rails-4
我正在使用遗留数据库,并且与一个连接表有多对多的关联,我已经在很大程度上解决了映射工作正常.但是还有一个列,如果是Book,作者模型可以说nm_author_books包含一个名为'royalty'的字段.问题是如何从任何方向访问此字段?
class Book {
String title
static belongsTo = Author
static hasMany = [authors: Author]
static mapping = { authors joinTable: [name: "mm_author_books", key: 'mm_book_id' ] }
}
class Author {
String name
static hasMany = [books: Book]
static mapping = { books joinTable: [name: "mm_author_books", key: 'mm_author_id'] }
}
Run Code Online (Sandbox Code Playgroud)
如果nm_author_book表具有[nm_book_id,nm_author_id,royalty],访问版税的方式是什么?
我想查找具有特定LanguagesUsers记录的所有用户.目前我正在尝试查询连接表,LanguagesUsers用于用户具有2个相应的languages_id和级别的所有实例
要找到只有一个关联的位置,这有效:
User.joins(:languages_users).where(languages_users: {language_id: 2, level: 5})
Run Code Online (Sandbox Code Playgroud)
如何在查询中包含2个languages_users,它们是真的?(例如,我想language_id: 2 level: 1
和 language_id: 3 level: 5
)
我试过这个,但它返回一个错误:
User.joins(:languages_users).where(languages_users: {language_id: 2, level: 5} AND languages_users: {language_id: 1, level: 3})
Run Code Online (Sandbox Code Playgroud)
这个返回一个空数组,即使肯定有2个languages_users符合此条件的用户:
User.joins(:languages_users).where(languages_users: {language_id: 2, level: 5}).where(languages_users: {language_id: 1, level: 3})
Run Code Online (Sandbox Code Playgroud)
这是什么格式?谢谢!!
更新:LanugagesUser是语言和用户之间的连接表,具有language_id,level,user_id
gem 'sqlite3', group: :development
group :production do
gem 'pg'
gem 'rails_12factor'
end
Run Code Online (Sandbox Code Playgroud)
更新2:由于两个答案都提出了一个或一个陈述,我认为我没有正确地传达这个事实:
两个记录很多.例如.我想知道用户有什么语言用户(language_id:1,级别:5)和LanguagesUser(language_id:2,级别:1)
jointable ×10
many-to-many ×4
hibernate ×3
jpa ×3
doctrine-orm ×2
activerecord ×1
exception ×1
field ×1
grails ×1
grails-orm ×1
java ×1
join ×1
jpa-2.0 ×1
map ×1
mapping ×1
migration ×1
mysql ×1
properties ×1
ruby ×1