我们有一个User具有List<String>权限的模型类,如下所示:
@LazyCollection(LazyCollectionOption.FALSE)
@CollectionOfElements
@Column()
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)
它生成了一个SQL表,其中包含如下条目:

我们最近升级到了Hibernate 4,并且由于@CollectionOfElements注释已从弃用变为完全删除,我们认为这是转移到的好时机@ElementCollection,如下所示:
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection // << CHANGED
@Column()
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)
但是,在启动时,我们无法使用我们的管理帐户登录.好奇,我们使用H2的JAR检查了数据库,发现该表已被更改:

我的问题:
@CollectionOfElements到新的DDL /架构更改的完整列表@ElementCollection?Collection类型都将受到这一更改的影响- Sets,Maps等我只是想确保我们不会留下任何数据的背后,还是想尽一切办法,我们的升级过程中.我们想要一个运行多个线程的简单单元测试 - 主要思想是主线程将一个保存提交到数据库,然后等待一个辅助线程来获取它.
我们发现必须为第二个Thread提交事务才能查询数据库并找到该项.否则,它将不存在.
我们试图使用H2数据库,Hibernate来管理访问,并且单元测试扩展AbstractTransactionalJUnit4SpringContextTests.
当我们尝试commit()现有的交易时:
... // Create and save our model object
sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();
... // Create and start second Thread, query, etc.
Run Code Online (Sandbox Code Playgroud)
我们收到错误消息:
org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:484)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:521)`
Run Code Online (Sandbox Code Playgroud)
但是当我们尝试仅扩展AbstractJUnit4SpringContextTests并使用@Transactional注释时:
@TransactionConfiguration(defaultRollback=false, transactionManager="transactionManager")
@Transactional()
public class DatabaseIntegrityTest extends AbstractJUnit4SpringContextTests {
Run Code Online (Sandbox Code Playgroud)
使用上面相同的提交代码,我们收到:
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)
Run Code Online (Sandbox Code Playgroud)
在我们第一次打电话给getCurrentSession() …
在处理针对特定跟踪问题的修补程序时,我们的工作流程如下所示:
1. git checkout patch; git pull upstream patch; # make sure we're up-to-date
2. git checkout -b issue-435-db-integrity-exception
3. # code some awesome
4. git commit -am "Fixes issue #435"
5. git push -u origin issue-435-db-integrity-exception
Run Code Online (Sandbox Code Playgroud)
然后,我们从打开拉入请求origin/435来upstream/patch,从而使代码审查可以采取在GitHub上/到位桶的地方.然后我们从第1步开始.
但是,虽然它听起来有点吵,但如果我们不必明确命名我们想要创建的远程分支,那将会很棒:
git push -u origin issue-435-db-integrity-exception
Run Code Online (Sandbox Code Playgroud)
重新输入分支名称并不是很有趣,我不同意将其更改为just 435或更紧凑的东西.
有没有办法(1)强制Git将当前分支推送到一个类似命名的分支,必要时创建它而不明确命名它?不是全球性的,只是一种现场的旗帜.
或者,是否有可能(2)访问Git别名中的当前分支,并编写如下内容:
[alias]
pnew = push -u origin $(git symbolic-ref --short HEAD)
Run Code Online (Sandbox Code Playgroud)
(但这不起作用 - 它认为该--short选项意味着push)
strong在接口中定义属性时,如下所示:
@property (nonatomic, strong) UIColor *petColor;
不再需要添加@synthesize,或者@dynamic手动定义内部ivar _petColor,这一切都可以正常工作.自动生成setter/getter,您可以在_petColor内部访问而无需任何其他代码.
但是,我对如何(如果有的话),覆盖二传手时,ARC知道是否插入保留有点困惑/释放取决于属性是否是电话strong还是weak?例如,如果我有两个属性:
@property (nonatomic, strong) UIColor *petColor;
@property (nonatomic, weak) SomeClass *petDelegate;
Run Code Online (Sandbox Code Playgroud)
如果我想覆盖这些属性的setter,它们似乎几乎完全相同?
- (void)setPetColor:(UIColor *)theColor {
if (![theColor isEqual:petColor]) {
_petColor = theColor;
}
}
- (void)setPetDelegate:(SomeClass *)theDel {
if (theDel != petDelegate) {
_petDelegate = theDel;
}
}
Run Code Online (Sandbox Code Playgroud)
它是否正确?如果是这样,ARC是否会自动retain/release在这两个设置器中插入正确的调用,或者仅在已覆盖的strong属性设置器中插入?
另外:请问weak财产的行为不同,在这种情况下,从assign财产的行为?
我正在尝试NSTextFieldCell使用以下代码在Swift(Xcode Beta 5)中创建自定义子类:
class CustomHighlightTextFieldCell : NSTextFieldCell {
required init(coder aCoder: NSCoder!) {
super.init(coder: aCoder)
}
init(imageCell anImage: NSImage!) {
super.init(imageCell: anImage)
}
init(textCell aString: String!) {
super.init(textCell: aString)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我在第2和第3个init()声明中收到编译错误:
/Users/Craig/projects/.../CustomHighlightTextFieldCell:8:40: Invalid redeclaration of 'init(imageCell:)'
/Users/Craig/projects/.../CustomHighlightTextFieldCell.swift:17:5: 'init(imageCell:)' previously declared here
/Users/Craig/projects/.../CustomHighlightTextFieldCell:7:39: Invalid redeclaration of 'init(textCell:)'
/Users/Craig/projects/.../CustomHighlightTextFieldCell.swift:21:5: 'init(textCell:)' previously declared here
Run Code Online (Sandbox Code Playgroud)
虽然这里有一些奇怪的编译器错误(我得到通常的"SourceKitService终止,编辑器功能暂时限制."消息),似乎我在我的方法覆盖中遗漏了一些东西 - 但我不知道是什么.
我假设命名参数,或者至少是参数类型,表明这里有三种不同的init()方法,但显然我错过了这个谜题的关键部分.
编辑:如果我添加override到第二和第三种init()方法,我有一个单独的问题:
required init(coder aCoder: NSCoder!) {
super.init(coder: aCoder)
}
override init(imageCell …Run Code Online (Sandbox Code Playgroud) 当使用可选绑定来解包单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂:
if let childTitle = theItem.getChildItem()?.getTitle() {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,当提供变量作为参数时,我发现自己使用:
func someFunction(childTitle: String?) {
if let theChildTitle = childTitle {
...
}
}
Run Code Online (Sandbox Code Playgroud)
甚至只是用相同的名称重新定义它:
if let childTitle = childTitle { ... }
我开始想知道是否有一个快捷方式或更高效的执行nil检查的唯一目的是使用现有的变量.我想象过:
if let childTitle { ... }
这样的事情是否存在,或者至少是我上述两个临时解决方案的替代方案?
我不是Swift的新手,也不是Objective-C的新手,但是我Error今天看到一些奇怪的行为,这使得我更深入地挖掘了一个子类型.
使用NSString子类时(是的,下面的示例函数类似于不基于的类NSObject):
import Foundation
// Class version
class OddString : NSString {
override var description: String {
return "No way, José"
}
}
let odd = OddString()
func printIt(_ string: NSString) {
print(string.description)
}
print(odd.description)
printIt(odd)
Run Code Online (Sandbox Code Playgroud)
我看到了我期望看到的东西:
No way, José
No way, José
Run Code Online (Sandbox Code Playgroud)
但是,当我使用struct()编写(我认为是)等效代码时Error:
import Foundation
// Struct version
struct TestError : Error {
var localizedDescription: String {
return "I am a TestError"
}
}
let explosive = …Run Code Online (Sandbox Code Playgroud) 我已经执行了以下合并:
A---B---C---E (HEAD, merge of C and D)
/
D---|
Run Code Online (Sandbox Code Playgroud)
但我注意到E中的一些问题,并在F中修复了它们:
A---B---C---E---F (HEAD)
/
D---|
Run Code Online (Sandbox Code Playgroud)
我想修改提交,E以便它包含F.
当我尝试时git rebase -p -i HEAD~2,它会尝试创建常规(非合并)提交,甚至尝试让我重新解决在执行合并时已经解决的冲突E。
如何修复提交E,使其包含中所做的更改F?
似乎在标准的Xcode项目中,默认目标会自动"更新"编译源构建阶段与任何新添加的实现文件.这使用户不必将每个新文件拖入阶段.
我已经定义了第二个目标,其中包含大量的单元测试代码,它作为实际(第一个)应用程序目标的直接依赖关联.因此,目标可以单独维护,但第一个构建时,任何时候都是如此.第二个目标还包含一个Compile Sources阶段,但每次创建它时我都必须将新的源文件复制到此阶段.
我的问题:如何配置编译源构建阶段以自动包含项目中的所有源文件?(或者是所有源文件的子集?)
嘿伙计们,我在手机上运行以下代码,其中'object'是Cat,它是Animal的子类.动物有属性'颜色':
NSLog(@"Object: %@", object);
NSLog(@"Color: %@", [object color]);
NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:@selector(color)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:object];
[invocation invoke];
Run Code Online (Sandbox Code Playgroud)
我的控制台中的输出是:
2009-06-28 16:17:07.766 MyApplication[57869:20b] Object: <Cat: 0xd3f370>
2009-06-28 16:17:08.146 MyApplication[57869:20b] Color: <Color: 0xd3eae0>
Run Code Online (Sandbox Code Playgroud)
然后,我收到以下错误:
*** -[Cat <null selector>]: unrecognized selector sent to instance 0xd3f370
Run Code Online (Sandbox Code Playgroud)
有线索吗?我在其他类中使用这种类似的方法,但我无法弄清楚在这种情况下我做错了什么.选择器'颜色'显然存在,但我不知道它为什么没有被正确识别.
swift ×3
cocoa ×2
dynamic ×2
git ×2
h2 ×2
hibernate ×2
java ×2
objective-c ×2
git-rebase ×1
iphone ×1
optional ×1
properties ×1
spring ×1
sql ×1
squash ×1
struct ×1
transactions ×1
xcode ×1